如标题中所述,我想找到一种方法来检查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>
元素与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"/>
,它变成了唯一的,并且不会触发验证。
那么,如何在一个Schematron测试短语中同时检查ZDX
和XH
?
答案 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>