如何在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>
答案 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中实施。