Xml 在XSD中添加与父元素类型相同的元素序列
我正在尝试创建一个XSD来验证以下XML结构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">
<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>
可能重复…这可能会有帮助: