1
我有一些XML,你可以有根据属性进行选择的最简洁的方法是什么?
<a type="b">
<b></b>
</a>
或
<a type="c">
<c></c>
</a>
或
<a type="d">
<d></d>
</a>
但是下面是无效:
<a type="c">
<b></b>
</a>
我想创造一个表示这一点的XML Schema,但是,如果我理解正确,则以下内容不能正确地将type属性与标记的内容绑定。
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />
<xs:complexType name="A">
<xs:attribute name="type" type="AType" use="required" />
<xs:choice>
<xs:group ref="B" />
<xs:group ref="C" />
<xs:group ref="D" />
</xs:choice>
</xs:complexType>
<xs:simpleType name="AType">
<restriction base="xs:string">
<enumeration value="b"/>
<enumeration value="c"/>
<enumeration value="d"/>
</restriction>
</xs:simpleType>
<xs:complexType name="B">
STUFF
</xs:complexType>
<xs:complexType name="C">
OTHER STUFF
</xs:complexType>
<xs:complexType name="D">
YET MORE STUFF
</xs:complexType>
</xs:schema>
是要正确做到这一点是令人难以置信的冗长喜欢的唯一途径:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />
<xs:complexType name="A">
<xs:choice>
<xs:group ref="B" />
<xs:group ref="C" />
<xs:group ref="D" />
</xs:choice>
</xs:complexType>
<xs:complexType name="B">
<xs:attribute name="type" type="xs:string" fixed="b" />
STUFF
</xs:complexType>
<xs:complexType name="C">
<xs:attribute name="type" type="xs:string" fixed="c" />
OTHER STUFF
</xs:complexType>
<xs:complexType name="D">
<xs:attribute name="type" type="xs:string" fixed="d" />
YET MORE STUFF
</xs:complexType>
</xs:schema>
您使用XML并抱怨冗长? (zing!SCNR)好吧,严肃地说:您是否尝试过对A/B/C标签组使用不同的父标签?基于这个属性对我来说似乎不太常见(或明智)... – delnan 2011-01-26 16:12:35