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

问题描述 投票:0回答:1

我是schematron的新手,并尝试编写一个断言,用于验证'测试'节点的@Origin和@end的值,其范围为@Origin和@end of“bases”

我已经尝试过如下的断言,但它无法正常工作。

<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>
xml xsd schematron
1个回答
0
投票

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

然后你似乎以相反的方式实现了<sch:assert>规则(并且不完整,因为你没有测试Origin和End的绑定值)你宣布它。提醒:

  • 如果测试不正确,assert将发出消息;
  • 如果测试成立,report将发出消息。

作为提示,您可以使用<sch:let>来提高代码的可读性:

这是我实现控件的方式:

<sch:pattern>
    <sch:let name="min-origin" value="number(/tests_root/bases/bound/Origin/@value)"/>
    <sch:let name="max-end" value="number(/tests_root/bases/bound/End/@value)"/>

    <sch:rule context="test/End | test/Origin">
        <sch:assert test="@value &lt;= $max-end and @value &gt;= $min-origin" ><sch:name/>/@value is not within the allowed range [<sch:value-of select="$min-origin"/>,<sch:value-of select="$max-end"/>]. </sch:assert>
    </sch:rule>
</sch:pattern>
© www.soinside.com 2019 - 2024. All rights reserved.