【问题标题】:How to Validate in XSD the xml node value against it's neighbor xml node value如何在 XSD 中根据它的邻居 xml 节点值验证 xml 节点值
【发布时间】:2010-02-05 19:57:57
【问题描述】:

假设在 XSD 中我们定义了一个元素“答案”:

                <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>

在同一个文档中,我们将元素“语言”定义为:

                <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>

这两个都有一个条目&lt;xs:restriction base="answer"/&gt; 其中“答案”是预定义值的枚举。

因此,我需要验证名称 = 'some_answer' 的“答案”节点是否存在 还存在名称为“some_answer”的“答案”节点

例子:

<answer name="some_answer"/>
<language name="some_answer"/>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    我还没有尝试过,但这应该可以使用 XML 模式中的 keykeyref 元素。不过,您需要在两个方向上定义 key/keyref 关系。

    从语言 -> 答案的关系定义如下:

    <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

    【讨论】:

    • 谢谢。我将使用 XNavigator 进行验证。
    【解决方案2】:

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

    此类验证可能由其他验证检查器处理,例如 Schematron - 但常规 XML 架构无法做到这一点。

    【讨论】:

      猜你喜欢
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多