在兄弟元素中检查具有多个属性的重复数据 - Schematron

时间:2017-09-05 08:23:14

标签: xml validation schematron

如标题中所述,我想找到一种方法来检查XML兄弟元素中的重复属性数据。

我已经知道类似的问题 [这里] Check for duplicated attribute data in sibling elements - 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>元素与ZDXXH属性唯一。 测试的所有兄弟元素应满足ZDXXH属性不能同时等于另一个测试,否则会触发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"/>,它变成了唯一的,并且不会触发验证。

那么,如何在一个Schematron测试短语中同时检查ZDXXH

1 个答案:

答案 0 :(得分:0)

这应该有效

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