Schematron验证和唯一性

时间:2010-09-24 08:08:08

标签: xml xml-validation schematron

我正在尝试编写一些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 的直接子项。

2 个答案:

答案 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