Проверка и уникальность схемы - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь написать несколько правил 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 .

Ответы [ 2 ]

1 голос
/ 23 мая 2011

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

  <sch:pattern>
    <sch:rule context="elem">
      <sch:report test="count(a) != count(distinct-values(a))">
        Values not distinct</sch:report>
    </sch:rule>
  </sch:pattern>
0 голосов
/ 24 сентября 2010

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

<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 элемента.

Было бы более элегантно использовать его для каждого элемента , нет a .

...