Проверка дублирующихся данных с несколькими атрибутами в родственных элементах - Schematron

Как описано в заголовке, я хочу найти способ проверить повторяющиеся данные атрибутов в родственных элементах XML.

Я уже знаю аналогичный вопрос [здесь] Проверить наличие дублирующихся данных атрибутов в родственных элементах - Schematron , и я пробовал через него, у меня не сработало.

Моя ситуация заключается в проверке нескольких атрибутов.

<root>
  <test ZDX="a" XH="1" ps="sdf"/>
  <test ZDX="a" XH="2" ps="dfg"/>
  <test ZDX="a" XH="3" ps="hfgh"/>
  <test ZDX="a" XH="2" ps="ertewr"/><!--same with the 2nd line-->
</root>

Мне нужно, чтобы элемент <test> был уникальным с атрибутами ZDX и XH. все родственные элементы теста должны удовлетворять тому, что оба атрибута ZDX и XH не могут одновременно совпадать с другим тестом, иначе возникает ошибка проверки SchemaTron.

я пробовал так,

<rule context="/root/test">
  <assert test="count(self::test) = count(self::test[not(@ZDX=preceding-sibling::test/@ZDX and @XH=preceding-sibling::test/@XH)])">
  test is not unique
  </assert>
</rule>

он отлично работает в ситуации выше, но не работает в ситуации ниже

<root>
  <test ZDX="a" XH="1" ps="sdf"/>
  <test ZDX="a" XH="2" ps="dfg"/>
  <test ZDX="a" XH="3" ps="hfgh"/>
  <test ZDX="a" XH="4" ps="ertewr"/>
  <test ZDX="b" XH="5" ps="ndmfj"/>
  <test ZDX="b" XH="6" ps="yuoi"/>
  <test ZDX="b" XH="4" ps="qwrew"/><!--conflict with the 4th line-->
</root>

в последнем элементе test XH="4" запустит проверку, если я изменю последнюю строку <test ZDX="b" XH="4" ps="qwrew"/> на <test ZDX="b" XH="7" ps="qwrew"/>, она станет уникальной и не запустит проверку.

Итак, как я могу проверить как ZDX, так и XH в одной тестовой фразе Schematron?


person 王英俊    schedule 05.09.2017    source источник


Ответы (1)


Это должно работать

<sch:pattern id="duplicate-attribute" abstract="true">
    <sch:rule context="$element">
        <sch:report test="@$attribute = following-sibling::$element/@$attribute 
            or @$attribute = preceding-sibling::$element/@$attribute">
            Duplicate '$attribute' attribute value found
        </sch:report>
    </sch:rule>
</sch:pattern>

<sch:pattern is-a="duplicate-attribute">
    <sch:param name="element" value="test"/>
    <sch:param name="attribute" value="XH"/>
</sch:pattern>

<sch:pattern is-a="duplicate-attribute">
    <sch:param name="element" value="test"/>
    <sch:param name="attribute" value="ZDX"/>
</sch:pattern>
person Stefan Eike    schedule 20.09.2017