0

いくつかの Schematron ルールを作成しようとしていますが、そのうちの 1 つは、要素が親要素のスコープ内で一意であるかどうかをチェックすることになっています。だから私は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 には、値 "3" を持つ 2 つの要素 "a" があります。これは許可されるべきではありません。

これまでのところ、私はこの種のルールに行き着きました:

<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:ルール>
  </sch:パターン>
于 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に対して起動する方がエレガントです。

于 2010-09-24T10:37:31.717 に答える