如何测试Schematron中不存在的元素

时间:2016-03-21 16:12:26

标签: xml xslt schematron

仅仅是我还是不可能通过Schematron寻找不存在的元素。我似乎也无法找到任何关于此的文档。

采取以下规则:

    <sch:rule context="/A/B/C[@TYPE='TEST1']" id="identifier-required">
    identifier must be present
        <sch:assert test="not(.)" id="identifier-required">
    identifier-required: identifier must be present
        </sch:assert>
    </sch:rule>

并将其应用于以下文件:

<A>
   <B>
      <C TYPE="TEST2">TEST</C>
      <C TYPE="TEST3">TEST</C>
   </B>
</A>

理论上这应该失败,但我发现它没有。任何人都知道这是否是正确的行为?

2 个答案:

答案 0 :(得分:2)

当然可以检查Schematron中是否缺少元素。

你的断言并没有失败,因为它的规则上下文不匹配。

如果您的规则匹配,则必须存在.,因此<sch:assert test="not(.)">永远不会通过。

您可以改为将上下文设置为C的父级,然后断言这样的C不存在为子级:

<sch:rule context="/A/B" id="identifier-required">
    <sch:assert test="not(C[@TYPE='TEST1'])" id="identifier-required">
      identifier-required: identifier must be present
    </sch:assert>
</sch:rule>

但是你的诊断信息表明你实际上希望断言这样的C存在,所以也许你真正想要的是:

<sch:rule context="/A/B" id="identifier-required">
    <sch:assert test="C[@TYPE='TEST1']" id="identifier-required">
      identifier-required: identifier must be present
    </sch:assert>
</sch:rule>

将使用您的给定XML和消息失败,&#34;标识符必需:标识符必须存在&#34;。

答案 1 :(得分:1)

上下文永远不匹配的规则永远不会触发,永远不会报告错误。您需要定义一个规则,其中包含一些确实存在的上下文(例如&#34; /&#34;)并断言在该上下文中,必须至少有一个节点由A/B/C[@TYPE='TEST1']