[英]XML Schema: Validate distinct pair of elements
我嘗試生成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>
任何幫助將不勝感激!
從您的問題尚不清楚,擁有一個帶有零件(aaa,bbb)的盒子和另一個帶有零件(bbb,aaa)的盒子是否有效。
假設這是有效的,則可以使用count(box) = count(distinct-values(box/concat(part[1]/@label, part[2]/@label))
請注意, @label/text()
不會選擇任何內容。 屬性節點沒有子節點。
<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] ) )"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.