我有一些你可以拥有的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>
答案 0 :(得分:2)
在XSD 1.0中没有直接的方法。可以使用“条件类型赋值”的新功能在XSD 1.1中轻松完成。 Saxon和Xerces随附的最新版架构处理器支持此功能。