仅仅是我还是不可能通过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>
理论上这应该失败,但我发现它没有。任何人都知道这是否是正确的行为?
答案 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']