根据元素的属性限制元素的基数

时间:2014-06-11 13:41:29

标签: xml xsd schema

如果没有属性,我如何限制param元素的基数? 我希望它的最大出现次数为1(它在应用级别表现为默认参数) 所以这是有效的

<xml>
    <param>value</param>
    <param id="1">value</param>
    <param id="2">value</param>
    <param id="3">value</param>
</xml>

但这不是

 <xml>
    <param>value</param>
    <param>value2</param>
    <param id="1">value</param>
    <param id="2">value</param>
    <param id="3">value</param>
</xml>

到目前为止,我尝试了

一个param xs的定义:没有指定attirbute的元素和另一个带有指定属性的元素,包含在xs:choice中。但它不允许我使用两个具有相同名称的元素

1 个答案:

答案 0 :(得分:1)

如果您正在设计架构,那么最好让<param>具有不同的名称,因为它毕竟是。在 XSD 1.0 中,具有相同名称的元素应包含代表相同的类型。如果它具有固定值的id属性,则可以使用唯一性约束(这也会影响其他param元素)限制具有相同id的任何元素。这也会将其发生限制为0或1。

如果您无法更改XML,则可以选择使用具有 XSD 1.1 支持的解析器。在XSD 1.1中,您可以使用alternative types来获取相同的元素。您还可以使用assertions使用XPath强制执行规则,例如在父节点的上下文中使用count(param[not(@id)]) <= 1之类的测试:

<xs:complexType>
    <xs:sequence>
        <xs:element name="param" maxOccurs="unbounded">...</xs:element>
    </xs:sequence>
    <xs:assert test="count(param[not(@id)]) le 1" />
</xs:complexType>