Проверка 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" элемента. В этом конкретном примере для elem с id="qw1" есть два элемента "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.


person Marcin Cylke    schedule 24.09.2010    source источник


Ответы (2)


Если вы используете процессор Schematron с базовым механизмом XSLT/XPath 2.0 и хотите сделать контекст правила элементом ‹elem>, вы можете использовать:

  <sch:pattern>
    <sch:rule context="elem">
      <sch:report test="count(a) != count(distinct-values(a))">
        Values not distinct</sch:report>
    </sch:rule>
  </sch:pattern>
person alexbrn    schedule 23.05.2011

Я узнал, что это можно решить с помощью следующего правила:

<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.

person Marcin Cylke    schedule 24.09.2010