0

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

4

2 回答 2

1

如果您正在使用带有底层 XSLT/XPath 2.0 引擎的 Schematron 处理器,并且希望将规则的上下文设置为您可以使用的 <elem> 元素:

  <sch:模式>
    <sch:rule context="elem">
      <sch:report test="count(a) != count(distinct-values(a))">
        价值观不同</sch:report>
    </sch:rule>
  </sch:pattern>
于 2011-05-23T11:02:12.600 回答
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

于 2010-09-24T10:37:31.717 回答