我需要有关xml验证问题的建议。我的问题是我需要设置一个XSD for XML验证,它定义了两个必填字段和两个可选字段。根据现有数据,字段的特征会切换。
如果满足其中一个描述的案例,XML应该是有效的。
我正在考虑像下面这样的结构但是我无法使用我的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>
有没有办法实现我想做的事情?
答案 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)" />
(我没有测试过 - 我会尽快更新这篇文章,或者有人可能会在此期间发布更好的答案。)