假设在XSD中我们定义了一个元素'answer':
<xs:element name="answer" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="answer"/>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
在同一文档中,我们将元素'language'定义为:
<xs:element name="language" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="answer"/>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
这两个都有一个条目<xs:restriction base="answer"/>
其中“答案”是预定义值的枚举。
所以,我需要验证如果存在name ='some_answer'的“answer”节点 还存在名称为''some_answer'
的“答案”节点示例:
<answer name="some_answer"/>
<language name="some_answer"/>
答案 0 :(得分:2)
我没有尝试过,但应该可以使用XML架构中的 key 和 keyref 元素。您需要在两个方向上定义key / keyref关系。
语言关系 - &gt;答案定义如下:
<xs:key name="answerKey">
<xs:selector xpath="/answer"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="languageRef" refer="answerKey">
<xs:selector xpath="/language"/>
<xs:field xpath="@name"/>
</xs:keyref>
然后你也可以在另一个方向定义它:
<xs:key name="languageKey">
<xs:selector xpath="/language"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="answerRef" refer="languageKey">
<xs:selector xpath="/answer"/>
<xs:field xpath="@name"/>
</xs:keyref>
请参阅http://www.w3.org/TR/xmlschema-0/#specifyingUniqueness和http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#element-keyref
答案 1 :(得分:0)
你不能在XML模式中进行这种验证 - 你不能引用其他节点的值,或者当兄弟姐妹在那里(或缺少)时需要一个节点。
这些验证可能由其他验证检查程序处理,例如Schematron - 但常规XML架构无法执行此操作。