0

我正在尝试创建一个验证以下 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 元素包含为自身的序列?

4

1 回答 1

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>
于 2012-09-04T17:08:56.457 回答