在XSD中添加与父级相同类型的元素序列

时间:2012-09-04 15:43:57

标签: xml xsd xsd-validation

我正在尝试创建一个验证以下XML结构的XSD

<SystemData>
  <Item Value="Techno" ListType="Flat">
    <Node Value="Detroit" />
    <Node Value="Gabba" />
  </Item>
  <Item Value="House" ListType="Tree">
    <Node Value="Deep">
       <Node Value="New York" />
    </Node>
    <Node Value="Acid" />
    <Node Value="Chicago" />
  </Item>
</SystemData>

基本上有一个根SystemData元素,它包含一系列Item元素,这些元素可以包含一系列Node元素,每个元素都可以包含一系列节点元素,将树状结构建模为n级

所以我想出了这个:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="SystemData">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Item">
                <xs:complexType>
                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="Node">
                            <xs:complexType>
                                <xs:attribute name="Value" type="xs:string" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="Value" type="xs:string" use="required"/>
                    <xs:attribute name="ListType" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

如何将Node元素包含为自身序列?

1 个答案:

答案 0 :(得分:1)

这个想法是通过重用类型中的类型或元素定义中的元素定义来使内容模型可引用。这暗示了根据创作风格考虑选择方法的另一个标准。

选项1:重复使用类型中的类型,建议使用威尼斯盲人创作风格。

我会改变:

<xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="Node">
        <xs:complexType>
            <xs:attribute name="Value" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element> 
</xs:sequence>

要:

<xs:sequence>
    <xs:element name="Node" type="NodeType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

并添加:

<xs:complexType name="NodeType">
    <xs:sequence>
        <xs:element name="Node" type="NodeType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="Value" type="xs:string" use="required"/>
</xs:complexType>

选项2:对于“Salami Slice”创作风格,您需要引用全局元素。所以,我会改变:

<xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="Node">
        <xs:complexType>
            <xs:attribute name="Value" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element> 
</xs:sequence>

要:

<xs:sequence>
    <xs:element ref="Node" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

并添加:

<xs:element name="Node">
    <xs:complexType>
        <xs:sequence>
        <xs:element ref="Node" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="Value" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>