Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对XSD限制的XML验证_Xml_Xsd - Fatal编程技术网

针对XSD限制的XML验证

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

如何在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>

打开文件夹
删除内容。
创建新文件夹
将文件移动到文件夹中。

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

<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的名称空间”是什么意思——根本没有这样的东西。