2010-09-24 182 views
0

我想寫一些Schematron規則,其中一個應該檢查,如果元素在父元素的範圍內是唯一的。所以我有一個xml結構的例子:Schematron驗證和唯一性

<abc> 
    <elem id="qw0"> 
    <a>1</a> 
    <a>2</a> 
    <a>3</a> 
    </elem> 
    <elem id="qw1"> 
    <a>1</a> 
    <a>2</a> 
    <a>3</a> 
    <a>3</a> 
    </elem> 
</abc> 

我的規則應該檢查每個元素的「a」元素是否是唯一的。在此具體示例中,對於elemid =「qw1」有兩個元素「a」,其值爲「3」。這不應該被允許。

到目前爲止,我來到這樣的規則:

<iso:pattern id="doc.abc"> 
    <iso:title>checking ABC</iso:title> 
    <iso:rule context="elem"> 
    <iso:assert test="count(a[. = current()]) = 1">TACs should be unique.</iso:assert> 
    </iso:rule> 
</iso:pattern> 

但是,這並不工作,因爲它看起來在整個文件,而不僅僅是ELEM的直接孩子。

回答

0

我發現,這可能與以下規則來解決:

<iso:pattern id="doc.abc"> 
    <iso:title>checking ABC</iso:title> 
    <iso:rule context="a"> 
    <iso:assert test="count(parent::node()/a[. = current()) = 1">TACs should be unique.</iso:assert> 
    </iso:rule> 
</iso:pattern> 

但是,這激發了對每一個元素規則。

它會更優雅地發射它每elem,沒有a

1

如果您使用的是Schematron的處理器與底層XSLT/XPath的2.0發動機,並希望使該規則的背景下,< ELEM>元素,你可以使用:

 
    <sch:pattern> 
    <sch:rule context="elem"> 
     <sch:report test="count(a) != count(distinct-values(a))"> 
     Values not distinct</sch:report> 
    </sch:rule> 
    </sch:pattern>