我是schematron的新手,并尝试编写一个断言,用于验证'测试'节点的@Origin和@end的值,其范围为@Origin和@end of“bases”
我已经尝试过如下的断言,但它无法正常工作。
<sch:rule context="test">
<sch:assert test="End[*]/@value > ancestor::bases/bound/End/@value and Origin[*]/@value < 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>
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 <= $max-end and @value >= $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>