2014-02-27 72 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