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

Xml 在XSD中添加与父元素类型相同的元素序列,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我正在尝试创建一个XSD来验证以下XML结构 <SystemData> <Item Value="Techno" ListType="Flat"> <Node Value="Detroit" /> <Node Value="Gabba" /> </Item> <Item Value="House" ListType="Tree"> <Node Value="Deep">

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

<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>

基本上,有一个根系统数据元素,它包含一系列项目元素,这些元素可以包含一系列节点元素,每个节点元素都可以包含一系列节点元素,将树状结构建模到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>


如何将节点元素作为其自身的序列包含进来?

这样做的目的是通过重用类型中的类型或元素定义中的元素定义,使内容模型可引用。这提示在选择基于创作风格的方法时要考虑另一个标准

选项1:在类型中重用类型,建议使用Venetian blind创作样式

我会改变:

<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 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: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>
<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>

选项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 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: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>
<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>

可能重复…这可能会有帮助: