【问题标题】:Restricting cardinality of an element depending on its attributes根据属性限制元素的基数
【发布时间】:2014-08-01 14:28:22
【问题描述】:

当 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>

到目前为止,我尝试过

一个没有指定属性的参数 xs:element 和另一个具有指定属性的参数的定义,包装在 xs:choice 中。但它不允许我使用两个同名的元素

【问题讨论】:

  • 您能以任何方式修改您的 XML 源吗?例如添加一个属性?
  • 嗯,这更像是一个理论问题,我可以添加“默认”属性。也许这是一个不好的做法。

标签: xml xsd schema


【解决方案1】:

如果您正在设计架构,最好使用不同名称的&lt;param&gt;,因为它毕竟是不同的东西。在 XSD 1.0 中,具有相同名称的元素应该包含表示相同的类型。如果它有一个具有固定值的id 属性,则可以使用唯一性约束(这也会影响其他param 元素)限制具有相同id 的任何元素。这也将它的出现限制为 0 或 1。

如果您无法更改 XML,另一种方法是使用支持 XSD 1.1 的解析器。在 XSD 1.1 中,您可以将 alternative types 用于相同的元素。您还可以使用 assertions 来使用 XPath 强制执行规则,例如在父节点的上下文中使用 count(param[not(@id)]) &lt;= 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多