2014-01-22 98 views
1

我有一個XML模式定義一個進程的「規則」。每一個「規則集」適用於「資源」,這是這樣定義的特定列表:如何使用XSD限制具有給定屬性值的元素數量?

<rule_sets> 
    <rule_set name="Set 1" active="true"> 
    <resources> 
     <resource>Resource 1</resource> 
     <resource>Resource 2</resource> 
    </resources> 
    <rule ... /> 
    <rule ... /> 
    </rule_set> 
    <rule_set name="Set 2" active="false"> 
    <resources> 
     <resource>Resource 2</resource> 
     <resource>Resource 3</resource> 
    </resources> 
    <rule ... /> 
    <rule ... /> 
    </rule_set> 

我想一個限制添加到我的XSD,允許每個資源被分配到只有一個「主動「規則集;即'rule_set [@active =「true」]'。 (每個資源可以分配給任意數量的不活動規則集。)

這在XSD中可能嗎?

到目前爲止,我只是增加了一個關鍵的「rule_sets」元素(這是「RULE_SET」父)是這樣的:

<xs:key name="rule_set_resource_active_key"> 
    <xs:selector xpath="rule_set" /> 
    <xs:field xpath="resources/resource" /> 
    <xs:field xpath="@active" /> 
</xs:key> 

但是,這限制了我的每個資源是一個最大一個有效的規則集和一個不活躍的規則集,這並不是我想要的。是否有可能將此擴展到涵蓋我的要求?或者我可以重構我的文檔來實現這一目標嗎?

+1

你可以將'rule_set'作爲'resource'的依賴元素,然後將'max_occurs'設置爲1? – JWiley

回答

0

您可以在XSD中定義兩種類型的規則集(如果這是您的情況的可能性),其他一切都相同(使用xs:group在一個地方定義並在兩個規則集定義中重複使用)但活動屬性具有不同的限制(請參閱XML Schema How to Restrict Attribute by Enumeration限制XSD中的屬性值)。然後你可以在rule_sets中有兩個元素,一個maxoccurs綁定爲1,另一個無界限。

相關問題