[英]Schematron - Element validation based on its position
我正在使用Schematron进行一些业务规则验证。 我的xml数据如下所示:
<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>
我想在具有code/@code="TT500"
为code/@code="TT500"
的第一个<observation>
块的<outcome>
节点上执行一些特殊的业务验证检查。
我想我可以使用以下表达式来获取第一个预期的<observation>
块的位置
count(../../test/observation/code[@code="TT500"]/preceding-sibling::*)+1
但是我不知道如何将该位置与当前上下文中的节点进行比较以执行特殊验证。
更新:
为简单起见,我们假设在这种情况下要执行的特殊验证是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>
以下Schematron文档完全满足您的要求。 assert
和report
之间没有真正的区别,您可以反转任何规则以同时适合两者。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
<pattern>
<rule context="observation[code/@code = 'TT500' and not(preceding::observation[code/@code = 'TT500'])]">
<assert test="string-length(outcome/@value) ge 6"> outcome/@value should have at least 6 characters for the first TT500 observation </assert>
</rule>
</pattern>
</schema>
使用此SCH规则验证以下(无效)XML文档时:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="sample.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<labtests>
<test>
<observation>
<code code="TT900" name="NMCK"/>
<outcome value="07442"/>
</observation>
</test>
<test>
<observation>
<code code="TT500" name="LVCT"/>
<outcome value="85417"/>
</observation>
</test>
<test>
<observation>
<code code="TT500" name="LVCT"/>
<outcome value="36542"/>
</observation>
</test>
</labtests>
Schematron处理器将按照以下方式发出警告:
E [ISO Schematron] outcome/@value should have at least 6 characters for the first TT500 observation
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.