我正在尝试编写一些Schematron规则,其中一个应该检查,如果元素在父元素的范围内是唯一的。所以我有一个示例xml结构:
<abc>
<elem id="qw0">
<a>1</a>
<a>2</a>
<a>3</a>
</elem>
<elem id="qw1">
<a>1</a>
<a>2</a>
<a>3</a>
<a>3</a>
</elem>
</abc>
我的规则应检查每个元素的“a”元素是否唯一。在此特定示例中,对于具有 id =“qw1”的 elem ,有两个元素“a”,其值为“3”。这不应该被允许。
到目前为止,我已经达到了这样的规则:
<iso:pattern id="doc.abc">
<iso:title>checking ABC</iso:title>
<iso:rule context="elem">
<iso:assert test="count(a[. = current()]) = 1">TACs should be unique.</iso:assert>
</iso:rule>
</iso:pattern>
但这不起作用,因为它可以查看整个文档,而不仅仅是 elem 的直接子项。
答案 0 :(得分:1)
如果您正在使用带有底层XSLT / XPath 2.0引擎的Schematron处理器,并且想要将规则的上下文设为&lt; elem&gt;你可以使用的元素:
<sch:pattern> <sch:rule context="elem"> <sch:report test="count(a) != count(distinct-values(a))"> Values not distinct</sch:report> </sch:rule> </sch:pattern>
答案 1 :(得分:0)
我发现这可以通过以下规则解决:
<iso:pattern id="doc.abc">
<iso:title>checking ABC</iso:title>
<iso:rule context="a">
<iso:assert test="count(parent::node()/a[. = current()) = 1">TACs should be unique.</iso:assert>
</iso:rule>
</iso:pattern>
但是这会激活每个 a 元素的规则。
为每个 elem 启动它会更优雅,没有 a 。