2010-10-19 51 views
4

编辑:添加的键。如何在xml模式中定义递归类型的Xpath选择器

嗨,

我有以下类型的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> 

我需要AA XPath的选择申报keyref来ref属性,但我不知道如何定义递归路径。

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

谢谢你的时间。

+0

为了达到目的,你需要keyref吗?语义是重要的。 – 2010-10-19 12:40:06

+0

我使用id属性定义了一些元素。 id属性被声明为一个键。我想保证ref-attribute的内容是在id-attribute中定义的。你有没有得到我的意图,还是应该扩大范例? – kasten 2010-10-19 12:53:02

+0

@kasten:我看到的问题是,在您的示例中,您没有提供IDREF的ID或KEY。 – 2010-10-19 15:22:41

回答

11

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

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

<xsd:selector>元素包含XML路径语言( XPath)表达式,指定由字段指定的值必须是唯一的元素集合,因此它不应引用属性ref<xsd:field>元素是指在该集合中应该是唯一的值,因此它应该引用属性ref(其他值为fields为其他值,如果需要具有唯一值的组合)。

+0

非常感谢。我在我的问题之前试了一段时间,但错过了领先的“。”。谢谢你的帮助 – kasten 2010-10-27 07:24:55