2012-05-10 56 views
4

我想通過元素名稱來驗證父元素是否具有唯一的子元素。 我還需要驗證是否存在至少一個可能的元素。XML架構唯一子元素

<StorageTypes> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

將是有效的,但

<StorageTypes> 
    <Status/> 
    <Status/> 
    <Warning/> 
    <Error/>    
</StorageTypes> 

<StorageTypes>    
</StorageTypes> 

將是無效的。

我已經嘗試過使用xs:unique,選擇當前節點,但無法一般地選擇帶有字段元素的元素。

以下是我期待做的事情,但它不是我尋找的強大解決方案。我希望能夠添加更多的類型,而不必爲每次更改都更改xpath。

<element ect.> 
    <xs:unique name="something"> 
     <xs:selector xpath="."/> 
     <xs:field xpath="Status"/> 
     <xs:field xpath="Warning"/> 
     <xs:field xpath="Error"/> 
    </xs:unique> 
</element> 

這可能嗎?這是好的做法嗎?任何意見,將不勝感激。

回答

1

基於XSD 1.0的通用解決方案是不可能的。我不相信你的獨特性能夠達到你想要的,只是因爲一個字段的值是用text()來評估的。所以標籤的名字從來沒有扮演這個角色......

雖然你可能能夠實現的東西是接近你想要什麼,它可能不會在所有情況下工作,否則會缺乏優雅或feasability ...

下面的方法可以不考慮通過一些高雅......儘管如此,它可以起到相同的作用。

對於例如,相反,如果你使用一個屬性捕捉「標籤」的名字在:

<StorageTypes> 
    <Storage type="Status"/> 
    <Storage type="Warning"/> 
    <Storage type="Error"/> 
</StorageTypes> 

然後寫你的獨特的@type領域,結合存儲的序列,maxOccurs的任何=給你嚴格按照你的描述。

相反,如果你正在尋找的是居然有複雜的內容,或屬性是不允許的,那麼你可以使用替換組達到同樣的效果的元素。

+0

謝謝,我會更進的取代基。我有一個類似的解決方案,你提供的,但使用枚舉。我們一直在尋找更多的東西通用的,將允許延期的未來架構,而無需改變框架架構。 – gettingSmarter