如何为 XML 片段编写此 Schematron 验证测试?
How do I write this Schematron validation test for XML snippet?
我有这样一个 XML 片段:
<AAA>
<Field name="a"/>
<Field name="b"/>
<Field name="x"/>
<User id="x" id2="f"/>
<User id="y"/>
</AAA>
<AAA>
<Field name="r"/>
<Field name="z"/>
</AAA>
我需要这样的规则,如果用户标签存在,它应该检查 id
和 [=13 的属性值=] 存在于字段属性名称下。
所以在第一个 AAA
标签中,它会验证并给出 2 个错误,因为 "f"
没有' 作为字段名存在,"y"
也不存在。
AAA 标签并不总是有用户标签,用户标签也不总是同时具有 id
和 id2
。
我一直在摆弄一些 XPath 表达式,但无济于事。
如果您不能使用 XPath 2.0,那么您可以编写以下 Schematron 规则:
ISO Schematron
<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
<sch:pattern>
<sch:rule context="User[@id]">
<sch:assert test="@id = ../Field/@name">User ID does not exist as a field!</sch:assert>
</sch:rule>
<sch:rule context="User[@id2]">
<sch:assert test="@id2 = ../Field/@name">User ID2 does not exist as a field!</sch:assert>
</sch:rule>
</sch:pattern>
</sch:schema>
我假设输入 XML 文档没有命名空间。如果 User
元素首先不具有这些属性之一,或者 AAA
元素不具有 User
元素,则断言不会失败。
你没有说清楚为什么 Martin Honnen 的建议对你不起作用,所以我还是把它列在这里。规则如下所示:
<sch:pattern>
<sch:rule context="AAA">
<sch:report test="some $user in User satisfies not($user/(@id, @id2) = Field/@name)">User ID does not exist as a field!</sch:report>
</sch:rule>
</sch:pattern>
我有这样一个 XML 片段:
<AAA>
<Field name="a"/>
<Field name="b"/>
<Field name="x"/>
<User id="x" id2="f"/>
<User id="y"/>
</AAA>
<AAA>
<Field name="r"/>
<Field name="z"/>
</AAA>
我需要这样的规则,如果用户标签存在,它应该检查 id
和 [=13 的属性值=] 存在于字段属性名称下。
所以在第一个 AAA
标签中,它会验证并给出 2 个错误,因为 "f"
没有' 作为字段名存在,"y"
也不存在。
AAA 标签并不总是有用户标签,用户标签也不总是同时具有 id
和 id2
。
我一直在摆弄一些 XPath 表达式,但无济于事。
如果您不能使用 XPath 2.0,那么您可以编写以下 Schematron 规则:
ISO Schematron
<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
<sch:pattern>
<sch:rule context="User[@id]">
<sch:assert test="@id = ../Field/@name">User ID does not exist as a field!</sch:assert>
</sch:rule>
<sch:rule context="User[@id2]">
<sch:assert test="@id2 = ../Field/@name">User ID2 does not exist as a field!</sch:assert>
</sch:rule>
</sch:pattern>
</sch:schema>
我假设输入 XML 文档没有命名空间。如果 User
元素首先不具有这些属性之一,或者 AAA
元素不具有 User
元素,则断言不会失败。
你没有说清楚为什么 Martin Honnen 的建议对你不起作用,所以我还是把它列在这里。规则如下所示:
<sch:pattern>
<sch:rule context="AAA">
<sch:report test="some $user in User satisfies not($user/(@id, @id2) = Field/@name)">User ID does not exist as a field!</sch:report>
</sch:rule>
</sch:pattern>