如何在XSD中验证xml节点值对其邻居xml节点值的影响

时间:2010-02-05 11:34:51

标签: xml xsd

假设在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"/>

2 个答案:

答案 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/#specifyingUniquenesshttp://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#element-keyref

答案 1 :(得分:0)

你不能在XML模式中进行这种验证 - 你不能引用其他节点的值,或者当兄弟姐妹在那里(或缺少)时需要一个节点。

这些验证可能由其他验证检查程序处理,例如Schematron - 但常规XML架构无法执行此操作。