针对XSD限制的XML验证

时间:2015-04-17 07:25:50

标签: xml xsd

如何在XSD中指定step / @ nextTask值仅在与此XML文档中的task / @ name值不匹配时才有效:

<tasks>
    <task name="task-12">
        <step>Open folder</step>
        <step nextTask="task-14">Delete contents.</step>
    </task>
    <task name="task-13">
        <step nextTask="task-16">Create new folder folder</step>
    </task>
    <task name="task-14">
        <step>Move files into folder.</step>
    </task>
</tasks>

1 个答案:

答案 0 :(得分:1)

它相当笨拙,但您可以使用唯一性约束:

<xs:element name="task">
  <xs:unique>
    <xs:selector xpath=".|step"/>
    <xs:field xpath="@*"/>
  </xs:unique>
</xs:element>

笨拙是因为你不能为这两个不同的元素命名两个不同的属性,所以只要其他属性出现在这些元素上就会崩溃。

更好的解决方案是XSD 1.1断言:

<xs:element name="task">
  ...
  <xs:assert test="not(@name = step/@nextTask)"/>
</xs:element>

XSD 1.1目前在Saxon,Xerces和Altova中实施。