我尝试生成XML模式,以验证一个XML文件,该文件不应允许几个相同的元素出现多次。
下面应该有几个要素。在every下,必须有一对零件,并且此组合应该是唯一的。
使用了XSD 1.1和XPath 2.0,我已经尝试了几种解决方案,例如count()eq count(distinct()),count()eq 1,every及先前的兄弟姐妹。
尝试是这样:
<xs:assert test="count( box/part[1]/@label/text() || box/part[2]/@label/text() )
eq count( distinct-values( box/part[1]/@label/text() ||
box/part[2]/@label/text() ) )"/>
另一个是这个:
<xs:assert test="count(box) eq count(box[ not ( preceding-sibling::box/part[1]/[@label
=current()/part[1]/@label] or
preceding-sibling::box/part[2]/[@label
= current()/part[1]/@label] ) ])"/>
更具体地说,这应该是有效的:
<box_list>
<box>
<part label="aaa"/>
<part label="bbb"/>
<random_el id="8"/>
</box>
<box>
<part label="ccc"/>
<part label="iii"/>
<random_el height="9"/>
</box>
<box>
<part label="aaa"/>
<part label="kkk"/>
<random_el id="5"/>
</box>
</box_list>
以下内容必须无效:
<box_list>
<box>
<part label="aaa"/>
<part label="bbb"/>
<random_el id="8"/>
</box>
<box>
<part label="aaa"/>
<part label="bbb"/>
<random_el height="9"/>
</box>
<box>
<part label="aaa"/>
<part label="kkk"/>
<random_el id="5"/>
</box>
</box_list>
任何帮助将不胜感激!
答案 0 :(得分:0)
从您的问题尚不清楚,将一个带有零件的盒子(aaa,bbb)和另一个带有零件的盒子(bbb,aaa)是否有效。
假设这是有效的,那么您可以使用count(box) = count(distinct-values(box/concat(part[1]/@label, part[2]/@label))
请注意,@label/text()
不会选择任何内容。属性节点没有子节点。
答案 1 :(得分:0)
<xs:assert test="2*count(box) eq ( count( distinct-values((box/concat(part[1]/@label, part[2]/@label),
box/concat(part[2]/@label, part[1]/@label))) ) +
count( box[part[1]/@label eq part[2]/@label] ) )"/>