【问题标题】:XSD 'inclusive or'XSD '包含或'
【发布时间】:2014-02-27 12:34:06
【问题描述】:

我需要关于 xml 验证问题的建议。我的问题是我需要为 XML 验证设置一个 XSD,它定义了两个必填字段和两个可选字段。根据现有数据,字段的特性会发生变化。

如果满足上述任一情况,则 XML 应有效。

  1. 应该可以填写 AAA 和 BBB 字段。填写这些字段后,CCC 和 DDD 可能为空。
  2. 当填写CCC和DDD字段时,字段AAA和BBB应该是可选的。

我正在考虑类似以下的结构,但我无法使用我的 ALTOVA XMLSPY 2012 保存它。它说内容模型不是唯一的。

<xs:complexType name="ZZZType">
  <xs:annotation>
    <xs:documentation>Selection</xs:documentation>
  </xs:annotation>
  <xs:sequence>
    <xs:element name="XXX" type="xs:string" nillable="true" minOccurs="0"/>
    <xs:choice>
      <xs:sequence>
        <xs:element name="AAA" type="AAAType" nillable="false"/>
        <xs:element name="BBB" type="BBBType" nillable="false"/>
        <xs:element name="CCC" type="CCCType" nillable="false" minOccurs="0"/>
        <xs:element name="DDD" type="DDDType" nillable="false" minOccurs="0"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="AAA" type="AAAType" nillable="false" minOccurs="0"/>
        <xs:element name="BBB" type="BBBType" nillable="false" minOccurs="0"/>
        <xs:element name="CCC" type="CCCType" nillable="false"/>
        <xs:element name="DDD" type="DDDType" nillable="false"/>
      </xs:sequence>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

有没有办法实现我想做什么?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    不适用于 XML 架构更正:不适用于 XML Schema 1.0(感谢@PetruGardea 的观察)。使用 XSD 1.0,您可以限制复杂类型的结构和简单类型的内容,但不能根据其他类型的内容来限制类型。

    要使用 XSD 1.0 做到这一点,您需要另一层验证,您可以使用编程语言来实现,或者您可以使用类似 Schematron 的东西,这是一个非常流行的解决方案。您可以下载 ISO 标准并从官方网站上找到大量示例和教程。如果您了解 XPath 和 XSLT,您可能会发现它很容易使用。

    XML Schema 1.1 支持断言,这些断言是用 XPath 2.0 编写的(包括 if/else、循环以及 XPath 1.0 中已有的所有内容)。您可能可以在您的 &lt;complexType&gt; 中添加如下内容:

    <xs:assert test="(AAA and BBB or CCC or DDD) or (CCC and DDD or AAA or BBB)" />
    

    (我没有对此进行测试 - 我会尽快更新这篇文章,或者在此期间有人可能会发布更好的答案)。

    【讨论】:

    • 你应该更具体... XSD 1.1 是可能的。典型的答案是 XSD 1.0 + Schematron,或 XSD 1.1
    • 感谢@PetruGardea 的更正。我要修复答案。我不知道 XSD 1.1 支持断言。太酷了。
    • 是的,XSD 1.1 中的一些功能非常酷。不幸的是,对 XSD 1.1 的支持并不是很广泛,因此通常无法使用。
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2014-09-28
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多