代码之家  ›  专栏  ›  技术社区  ›  kasten

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

  •  4
  • kasten  · 技术社区  · 14 年前

    编辑:添加的键。

    你好,

    我有一个具有以下类型的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 但是我不知道如何定义递归路径。

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

    谢谢你的时间。

    1 回复  |  直到 14 年前
        1
  •  12
  •   jasso    14 年前

    <xsd:selector> 支持受限的xpath表达式。只有 child 允许使用轴,但xpath表达式可以 开始 具有 .// 所以可以使用递归表达式 .//entry1

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

    这个 <xsd:选择器> 元素包含一个XML路径语言(xpath)表达式,该表达式指定了一组元素,其中字段指定的值必须是唯一的,因此不应引用属性 ref . <xsd:field> 元素引用在该集合中应该唯一的值,因此它应该引用属性 裁判 (以及 fields 对于其他值,如果需要值的唯一组合)。