针对XSD限制的XML验证
如何在XSD中指定step/@nextTask值只有在与此XML文档中的task/@name的值不匹配时才有效:针对XSD限制的XML验证,xml,xsd,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 na
<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>
打开文件夹
删除内容。
创建新文件夹
将文件移动到文件夹中。
这相当笨拙,但您可以使用唯一性约束:
<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实施。alexwlchan先生,你能给出答案吗?我们能给task/@name提供ID,然后如何引用ID的值吗?谢谢kay先生。我使用JAVA进行验证,它不接受xsd1.1的名称空间。为了唯一性,我可以给task/@name指定ID,但我们如何测试它是否与step/@nextTask的值不匹配。无论在xsd1.1中是否可能。PLZID不会帮助您,因为您希望整个文档具有唯一性。如果您使用的是Java,那么就有两个XSD1.1处理器可用:Xerces和Saxon。我不知道你所说的“XSD1.1的名称空间”是什么意思——根本没有这样的东西。