【问题标题】:Build XML schema that requires element or attribute, but not both构建需要元素或属性但不是两者都需要的 XML 模式
【发布时间】:2013-05-21 14:08:02
【问题描述】:

我想创建一个具有以下约束的 XML 模式:

  • 根元素应为list
  • list 包含一组 node 元素。
  • node 元素可以具有value 属性。
  • node 元素可以包含value 元素。
  • node 元素只能(并且完全)一个value 属性或value 元素。

以下是验证上述约束的有效 XML 示例:

<?xml version="1.0" ?>
<list>
    <node id="1" value="A" />
    <node id="2">
        <value>B</value>
    </node>
</list>

我尝试了以下 XSD 架构:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="list">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="node" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType mixed="true">
            <xs:sequence>
              <xs:element type="xs:string" name="value" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="id" use="optional"/>
            <xs:attribute type="xs:string" name="value" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

此 XSD 架构验证我的第一个和第二个约束,但不是第三个。

根据我的限制,以下 XML 示例无效,但是,它对我以前的 XSD 架构有效。

<?xml version="1.0" ?>
<list>
    <node id="2" value="A" /> <!-- valid -->
    <node id="4">
        <value>D</value>
    </node><!-- valid -->
    <node id="1" /><!-- not valid, missing value -->
    <node id="3" value="B">
        <value>C</value>
    </node><!-- not valid, both attribute and element are declared -->
</list>

如何更改架构以验证所有约束?

提前致谢。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    这在 XSD 1.0 中是不可能的。

    XSD 1.1 应该可以使用断言:

    <xs:assert test="not(@value and value)"/>
    

    如果@valuevalue 都存在则失败。要检查是否只有一个属性或子元素,请使用:

    <xs:assert test="count((value, @value))=1"/>
    

    按照 Michael Kay 在 cmets 中的建议。

    也许可以使用其他一些 XML 验证技术,例如 Schematron。

    【讨论】:

    • 次要条件:如果@value 和 value 中的一个必须存在,则条件应该是test="exists(@value) != exists(value)",或者可能是count((value, @value))=1
    【解决方案2】:

    您可以创建具有必需属性的第一种类型和具有必需元素的第二种类型。然后使用包含这两种类型的选择合成器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2012-11-13
      • 2011-05-06
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多