Проверьте, что атрибут подэлемента находится в диапазоне атрибута предка: элементы - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в схематроне и пытаясь написать утверждение, которое будет проверять значения @Origin и @end узлов 'tests' с диапазоном @Origin и @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 голосов
/ 28 марта 2019

Некоторые вещи не правильны в вашем 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 &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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...