Я использую Schematron для проверки некоторых бизнес-правил. Мой данные XML выглядит следующим образом:Schematron - проверка элемента на основании его позиции
<labtests>
<test>
<observation>
<code code="TT900" name="NMCK"/>
<outcome value="074042"/>
</observation>
</test>
<test>
<observation>
<code code="TT500" name="LVCT"/>
<outcome value="852417"/>
</observation>
</test>
<test>
<observation>
<code code="TT500" name="LVCT"/>
<outcome value="36542"/>
</observation>
</test>
<test>
<observation>
<code code="TT100" name="GVMC"/>
<outcome value="874541"/>
</observation>
</test>
<test>
<observation>
<code code="TT500" name="LVCT"/>
<outcome value="369521"/>
</observation>
</test>
</labtests>
Текущий контекст установлен labtests/test/observation
, как показано ниже:
<iso:rule context="labtests/test/observation">
<!--perform all validations here-->
</iso:rule>
Я хочу, чтобы выполнить некоторые специальные проверки проверки бизнеса на <outcome>
узла для первых <observation>
блока, имеющего code/@code="TT500"
,
Я думаю, что я могу использовать следующее выражение, чтобы получить позицию первого намеченные <observation>
блок
count(../../test/observation/code[@code="TT500"]/preceding-sibling::*)+1
, но я не знаю, как сравнить эту позицию с узлом в текущем контексте для выполнения специальной проверки ,
UPDATE:
Для простоты предположим, что специальная проверка будет проводиться в данном случае является то, что длина outcome/@value
должна быть больше или равна 6. т.е.
<iso:report test="not(string-length(outcome/@value) >= 6">
outcome/@value should have at least 6 characters for the first TT500 observation
</iso:report>
объяснить, что ваш должно выполняться утверждение или правило, с какими узлами он связан, и в какой ситуации он должен утверждать или сообщать (то есть, что разрешено, а что нет). Еще лучше: покажите ** два ** документа, один из которых действителен, а второй - нет. –
@ MathiasMüller См. Обновленный вопрос. –