检查子元素的属性是否在ancestor:elements属性范围内

时间:2019-03-28 06:41:46

标签: xml xsd schematron

我是schematron的新手, 尝试编写一个断言,以验证@test节点的@Origin和@end的值,其范围为@Origin和'bases的@end

我尝试了以下断言,但是它不起作用。

<sch:rule context="test">
  <sch:assert test="End[*]/@value &gt; ancestor::bases/bound/End/@value and Origin[*]/@value &lt; ancestor::bases/bound/Origin/@value " >values are within range. </sch:assert>
</sch:rule>
<tests_root>
    <bases>
        <bound x="-276.724" xEnd="-276.193">
            <Origin value="1"/>
            <End value="20"/>
        </bound>
    </bases>
    <tests>
        <test x="-276.724" xEnd="-276.193">
            <Origin value="1"/>
            <End value="2"/>
        </test>
        <test x="-276.193" xEnd="-260.29">
            <Origin value="2"/>
            <End value="5"/>
        </test>
        <test x="-260.29" xEnd="-240.194">
            <Origin value="5"/>
            <End value="10"/>
        </test>
        <test x="-240.194" xEnd="-220.046">
            <Origin value="10"/>
            <End value="19"/>
        </test>
        <test x="-220.046" xEnd="-200.09">
            <Origin value="19"/>
            <End value="20"/>
        </test>
    </tests>
</tests_root>

1 个答案:

答案 0 :(得分:0)

在您的Schematron中有些事情是不正确的,主要是ancestor::bases/bound/End/@value与任何节点都不匹配,因为<bases>不是不是{{1的祖先}}。使用<test>将检索您想要的值。

然后,您似乎以相反的方式实现了/tests_root/bases/bound/End/@value规则(并且不完整,因为您没有测试Origin和End的绑定值)。提醒:

  • 如果测试不正确,<sch:assert>将发出一条消息;
  • 如果测试为真,则assert将发出一条消息。

作为提示,您可以使用report来提高代码的可读性:

这是我实现控件的方式:

<sch:let>