Некоторые вещи не правильны в вашем Schematron, главное, что ancestor::bases/bound/End/@value
не будет соответствовать ни одному узлу, потому что <bases>
это , а не предок <test>
.Использование /tests_root/bases/bound/End/@value
приведет к получению нужного значения.
Тогда кажется, что вы реализовали правило <sch:assert>
противоположным способом (и неполным, потому что вы не проверяете привязанные значения для начала и конца)Вы объявили это.Напомним:
- и
assert
вызовут сообщение, если проверка не соответствует действительности; - a
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>