如何为 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 标签并不总是有用户标签,用户标签也不总是同时具有 idid2

我一直在摆弄一些 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>