2010-11-17 49 views
2

我該怎麼做/或者在XSD中進行驗證?例如在下面的XML片斷,如果actionA添加),則後續的屬性和元素是requiredXSD:或者/或者語法

<Post postID="22793" action="A" ...> 
    <Transaction ...> 
     <Disposition ...> 
     <AccountInformation ... /> 
     <ThirdPartyInformation ... /> 
     </Disposition> 
     <IndividualInformation ... /> 
    </Transaction> 

    ... 
</Post> 

但如果動作d然後隨後的屬性和屬性,是禁止::

<Post postID="22793" action="D" /> 

那就是:如果行動刪除D),然後將剩餘的屬性改變從

  • 需要

  • 禁止

和隨後的元件從

切換

minOccurrences="0" maxOccurrences="0" 

是否有可能使用XSD定義XML結構?

回答

5

之一the big criticisms of XSD是它未能

...沒有提供設施,以指出一個屬性的值或存在是依賴於值或其他屬性的存在(所謂的同現約束)。

因此,它不能指定您所描述的約束條件。在大多數情況下,我已經看到項目使用XSLT來驗證其XSD失敗的文檔。但other Schema languages確實存在,您可能會獲得更多成功。我聽說有些人出於各種原因切換到Relax NG

+0

非常好,謝謝。提供與其他人相同問題的鏈接,表明a)我正在做的事情並不少見b)其他人希望做到這一點c)這是不可能的。它是** c **,這是公認的答案:不可能。 – 2010-11-17 20:44:20

1

現在在XSD版本1.1中是可以的。

XSD 1.1

工作組對 版本1.0和1.1之間變化的戰略指導方針可以概括如下:

2.Support爲同現約束(這肯定會涉及增加的XML傳輸語法,這將不被 1.0處理器理解)

當然,正在使用XPATH 2.0用於簡單和複雜類型的斷言。爲此目的定義了一個新標籤。

的xs:斷言

另一種有用的新的機制是

類型替代組件提供布爾 條件之間的關聯(如XPath表達式)和類型定義。它們在條件類型分配中使用 。

XS:替代

<xs:element name="title" type="xs:anyType"> 
    <xs:alternative test="@type='text'" type="xs:string"/> 
    <xs:alternative test="@type='html'" type="htmlContentType"/> 
    <xs:alternative test="@type='xhtml'" type="xhtmlContentType"/> 
    <xs:alternative test="@type" type="xs:error"/> 
    <xs:alternative type="xs:string"/> 
</xs:element> 

你可以閱讀更多的this