在XML Schema中引用XML类型

时间:2014-12-17 09:56:16

标签: xml xsd

鉴于以下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类型的元素。所以运动不够描述......

2 个答案:

答案 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来实现此类控制。

相关问题