XML(XSD)操作方法:元素内容是另一个元素的名称

时间:2018-11-06 17:16:39

标签: xml xsd

我试图弄清楚如何编写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语法兼容的方式进行操作。 谢谢!

1 个答案:

答案 0 :(得分:1)

这就是keykeyref的作用。在RootNode级别,定义一个密钥以使每个.//BasicElement具有一个不同的@name,并定义一个keyref来表示每个.//LeftSide和{{1 }}必须是这些键之一的引用。