2014-02-27 50 views
2

我需要一个XML验证问题的建议。我的问题是,我需要设置一个用于XML验证的XSD,它定义了两个必填字段和两个可选字段。根据可用的数据,字段的特征切换。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> 

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

回答

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,loops和XPath 1.0中已包含的所有内容)编写的。你也许可以添加到您的<complexType>是这样的:

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

(我没有测试 - 我会尽快做我更新这个帖子,还是有人会张贴在此期间,一个更好的答案)。

+1

你应该更具体一些......这是可能的XSD 1.1。典型的答案是XSD 1.0 + Schematron或者XSD 1.1 –

+1

感谢@PetruGardea的更正。我要解决答案。我不知道XSD 1.1支持断言。这很酷。 – helderdarocha

+1

是的,XSD 1.1中的一些功能非常酷。不幸的是,对XSD 1.1的支持不是很广泛,所以经常不能使用这个原因。 – Dijkgraaf