XSD'包容性'或'

时间:2014-02-27 12:34:07

标签: xml xsd

我需要有关xml验证问题的建议。我的问题是我需要设置一个XSD for XML验证,它定义了两个必填字段和两个可选字段。根据现有数据,字段的特征会切换。

如果满足其中一个描述的案例,XML应该是有效的。

  1. 应该可以填写AAA和BBB字段。填写这些字段时,CCC和DDD可能是emtpy。
  2. 当填写字段CCC和DDD时,字段AAA和BBB应是可选的。
  3. 我正在考虑像下面这样的结构但是我无法使用我的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>
    

    有没有办法实现我想做的事情?

1 个答案:

答案 0 :(得分:0)

不使用XML Schema 更正:不使用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中已有的所有内容)。你可以添加这样的<complexType>

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

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