鉴于以下XML,我想按类型引用不同的练习:
<root>
<exercises type="foo">
<text></text>
</exercises>
<exercises type="bar">
<audio></audio>
</exercises>
</root>
我会这样设置:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- xml def -->
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="exercises" type="foo-exercises"/>
<xs:element name="exercises" type="bar-exercises"/>
</xs:sequence>
</xs:complexType>
</xs:element>
但是如何在给定的xml中明确检查“type”定义?也就是说,元素属于给定类型?也就是说,根据相应的定义检查给定的类型?
编辑: 我奇怪地说:我的问题是,引用不在类型定义中但在对字段的引用中的“类型”/属性。
说:我想检查一下,实际上是否有3个foo类型的元素和2个bar类型的元素。所以运动不够描述......
答案 0 :(得分:2)
我建议你这个架构..
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="exercises" maxOccurs="unbounded" minOccurs="0" type="exercise"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="exercise">
<xs:sequence>
</xs:sequence>
</xs:complexType>
<xs:complexType name="foo">
<xs:complexContent>
<xs:extension base="exercise">
<xs:sequence>
<xs:element type="xs:string" name="text" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="bar">
<xs:complexContent>
<xs:extension base="exercise">
<xs:sequence>
<xs:element type="xs:string" name="audio" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
这是相关的xml ...
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<exercises xsi:type="foo">
<text></text>
</exercises>
<exercises xsi:type="bar">
<audio></audio>
</exercises>
</root>
通过这种方式,您使用了xsd扩展名。 See here the reference
答案 1 :(得分:2)
我担心使用XML Schema无法实现这种元素定义。 换句话说,您不能将元素内容模型绑定到此元素(或任何其他元素)中的特定属性值。
例如,可以使用Schematron来实现此类控制。