我试图弄清楚如何编写XSD模式,以便正确表达元素引用。这是一个简短的示例,解释了我要实现的目标。 我有一些基本元素,它们都有不同的(唯一)名称。我想通过按名称引用将它们分组在一个更大的元素中。
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
<BasicElements>
<BasicElement name="Element1"/>
<BasicElement name="Element2"/>
<BasicElement name="Element3"/>
<BasicElements>
<ElementGroups>
<ElementGroup name="ElementsAlongAPath">
<LeftSide>Element1</LeftSide>
<RightSide>Element2></RightSide>
</ElementGroup>
<ElementGroup name=OtherElementsAlongAPath">
<LeftSide>Element2</LeftSide>
<RightSide>Element3</RightSide>
</ElementGroup>
</ElementGroups>
</RootNode>
XSD文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="TestNS" xmlns:test="TestNS">
<xs:element name="RootNode">
<xs:complexType>
<xs:sequence>
<xs:element ref="test:BasicElements" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="test:ElementGroups" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="BasicElements">
<xs:complexType>
<xs:sequence>
<xs:element ref="test:BasicElement" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="BasicElement">
<!--Attributes, stuff... -->
</xs:element>
<xs:element name="ElementGroups">
<xs:complexType>
<xs:sequence>
<xs:element ref="test:ElementGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ElementGroup">
<xs:complexType>
<xs:sequence>
<xs:element name="LeftSide" minOccurs="0" maxOccurs="1">
<!-- How to express reference to BasicElement here ?-->
</xs:element>
<xs:element name="RightSide" minOccurs="0" maxOccurs="1">
<!-- How to express reference to BasicElement here ?-->
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我可以很容易地写出 LeftSide 和 RightSide 子元素是 type = xs:string ,而只需写下我的BasicElements的名称上面有,但我想知道如何以与XSD语法兼容的方式进行操作。 谢谢!
答案 0 :(得分:1)
这就是key
和keyref
的作用。在RootNode
级别,定义一个密钥以使每个.//BasicElement
具有一个不同的@name
,并定义一个keyref
来表示每个.//LeftSide
和{{1 }}必须是这些键之一的引用。