如何在xml架构中为递归类型定义Xpath选择器

时间:2010-10-19 12:26:41

标签: xml xsd

编辑:添加了密钥。

您好,

我有一个包含以下类型的xml架构:

<xs:complexType name="definition">
  <xs:sequence/>
  <xs:attribute name="id"/>
</xs:complexType>

<xsd:key name="definitionId">
  <xsd:selector xpath="definition"/>
  <xsd:field xpath="@id"/>
</xsd:key>

<xs:complexType name="elem">
  <xs:sequence>
    <xs:element name="entry1" type="elem" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="entry2" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute name="ref" type="xs:string" use="required"/>
</xs:complexType>

这允许类似:

<definition id="A">
<definition id="B">
<definition id="C">

<entry1 ref="A">
  <entry1 ref="B">
    <entry1 ref="C"/>
    <entry2/>
  </entry1>
  <entry1 ref="C">
  </entry1>
</entry1>

我需要一个XPath选择器来声明ref属性的keyref,但我不知道如何定义递归路径。

<xsd:keyref name="definitionRef" refer="definitionId">
  <xsd:selector xpath="???"/>  <<<how to find all "ref" of entry1 ?    
  <xsd:field xpath="@ref"/>
</xsd:keyref>

感谢您的时间。

1 个答案:

答案 0 :(得分:12)

<xsd:selector>支持受限制的XPath表达式。仅允许child轴,但XPath表达式可以开始.//,因此您可以使用递归表达式.//entry1

有关详细信息,请参阅规范:http://www.w3.org/TR/xmlschema-1/#c-selector-xpath

<xsd:selector>元素包含一个XML路径语言(XPath)表达式,指定了一组元素,其中由field指定的值必须是唯一的,因此它不应引用属性ref<xsd:field>元素是指在该集合中应该唯一的值,因此它应该引用属性ref(以及fields的其余值到其他值,如果您需要独特的价值观组合)。