2012-11-07 157 views
1

我已經經歷了許多網站,然後創建了Xml架構,其中的其他屬性取決於其中一個屬性的值。XML驗證不驗證基於另一個屬性的屬性

如下XML文件:

<?xml version="1.0"?> 
<Main> 
    <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/> 
    <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/> 
    <Matter kind="country" continent="Asia" name="japan"/> 
</Main> 

那種屬性可以有水果,汽車和國家。並根據屬性需要其他參數,如國家值,所需的大陸屬性。

和下面的是XSD文件,

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Main"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="Matter"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="Matter"> 
    <xs:complexType> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
     <xs:alt cond="@kind='fruits'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="fruits"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     </xs:alt> 
     <xs:alt cond="@kind='car'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="car"/> 
     <xs:attribute name="brand" type="xs:NCName"/> 
     <xs:attribute name="quantity" type="xs:integer"/> 
     <xs:attribute name="color" type="xs:NCName"/> 
     </xs:alt> 
     <xs:alt cond="@kind='country'"> 
     <xs:attribute name="kind" use="required" type="xs:NCName" fixed="country"/> 
     <xs:attribute name="continent" type="xs:NCName" use="required"/> 
     </xs:alt> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

當我確認上述XSD的XML文件,我得到的錯誤「元素ALT是無效的,錯位,或過於頻繁地發生。

請幫我確認上述文件,在適當的XSD

+2

xs:alt不是有效的Xsd構造。 Xsd不會根據文檔的內容進行驗證,它只允許驗證「形狀」。我認爲xs:alt可能是模式的擴展,如果是這種情況,您需要使用能夠理解如何處理它的驗證器。開箱即用,您的文檔不是有效的模式,因爲它使用的是未在XSD中定義的結構(關鍵字)。 – Pawel

回答

1

我不知道你在哪裏得到了XSL的想法:?ALT從XML模式或許有些專有擴展

XSD 1.1標準有一個稱爲條件類型賦值的設施,有點像這樣,它帶有一個名爲xs:alternative的元素。最近版本的Xerces和Saxon支持XSD 1.1。

+0

我認爲,通過XSD無法實現屬性條件檢查,指向DSD http://cs.au.dk/~amoeller/XML/schemas/dsd-example.html。 – Ayush

+0

有很多驗證技術可用。 DSD是我沒有遇到過的。如果您沒有致力於XSD路線,首先看的地方是Relax NG。 –

0

我想你應該使用xs:extension如下。 這是一個示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Main xmlns="http://www.example.com/matters"> 
    <Fruit calories="10" name="apple" quantity="10" color="red"/> 
    <Car brand="ford" name="ikon" quantity="1" color="red"/> 
    <Car brand="dodge" name="fire" quantity="1" color="blue"/> 
    <Country continent="Asia" name="Japan"/> 
    <Country continent="Europe" name="Italy"/> 
</Main> 

這是此XML的XSD。唯一的限制是相同類型的元素應該按順序分組。 您也可以添加固定屬性,但由於標籤的名稱表示類型,所以我沒有發現它們是必需的。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <!-- document structure --> 
    <xs:element name="Main"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <!-- types definitions --> 
    <xs:complexType name="matterType"> 
     <xs:attribute name="name" use="required" type="xs:NCName"/> 
    </xs:complexType> 
    <xs:complexType name="fruitType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="color" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="calories" type="xs:integer"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="carType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="brand" type="xs:NCName"/> 
       <xs:attribute name="quantity" type="xs:integer"/> 
       <xs:attribute name="color" type="xs:NCName"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="countryType"> 
     <xs:complexContent> 
      <xs:extension base="matterType"> 
       <xs:attribute name="continent" type="xs:NCName" use="required"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 
0

看起來您正在嘗試創建另一種類型。我認爲你應該用自己的規則重構並創建新的類型。然後你可以繼續使用你原來的修改過的xsd和解析。

<?xml version="1.0"?> 
<Main> 
    <fruits calories="10" name="apple" quantity="10" color="red"/> 
    <car brand="ford" name="ikon" quantity="1" color="red"/> 
    <country continent="Asia" name="japan"/> 
</Main>