如何使用XSD限制具有给定属性值的元素数量?

时间:2014-01-22 13:49:31

标签: xml xpath xsd

我有一个XML模式,用于定义流程的“规则”。每个“规则集”都适用于给定的“资源”列表,其定义如下:

<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 个答案:

答案 0 :(得分:0)

你可以在XSD中定义两种类型的规则集(如果你的情况可能),其他一切都相同(使用xs:group在一个地方定义并在两个ruleSet定义中重用)但属性active有不同的限制(请参考XML Schema How to Restrict Attribute by Enumeration以限制XSD中的属性值。然后你可以在rule_sets中有两个元素,其中maxoccurs有界为1,另一个无界。