2012-01-05 14 views
3

我有一個架構如下:當complexType被擴展時是否繼承了混合?

<xs:element name="td"> 
    <xs:complexType> 
    <xs:complexContent> 
     <xs:extension base="cell.type"/> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="cell.type" mixed="true"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element ref="p"/> 
    </xs:sequence> 
</xs:complexType> 

有些解析器允許直接PCDATA的元素,而有的則沒有。在XSD建議(3.4.2)中有一些內容表明,當一個複雜類型的內容很複雜,並且都沒有混合屬性時,有效混合是錯誤的。這意味着混合內容可能生效的唯一方式是如果cell.type的擴展導致mixed =「true」被繼承。

有人對模式更熟悉評論正確的解釋嗎?

(順便說一句:如果我有模式我會移動的混合=「真」的元素定義的控制,但是這不是我的電話。)

+1

該問題已在W3C郵件列表中提出:http://lists.w3.org/Archives/Public/xmlschema-dev/2005Sep/0018.html – Damien 2013-03-15 17:02:01

回答

4

任何人讀我的問題可能需要閱讀this線程也(通過Damien)。看起來我的回答並不完全正確:解析器/驗證程序不以相同方式處理基本/派生元素上的混合屬性聲明。


關於在W3C的XML Schema規範的擴展part 1複雜類型,的section 3.4.6分節1.4.3.2.2.1說

兩個[衍生和基] {內容類型}Š絕混合或者兩者都必須是僅限元素的。

所以是的,它是繼承的(或者更像是你不能覆蓋它 - 最後是同樣的東西)。

基本上,你所描述的是所期望的(並且就我而言)最合乎邏輯的行爲。

我創建了一個簡單的模式,用Eclipse的XML工具運行一點測試。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="c"> 
    <xs:complexType> 
     <xs:complexContent mixed="false"> 
     <xs:extension base="a"/> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="a" mixed="true"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="b"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

上述模式是有效的,在這個意義上,不是Eclipse的,也不W3C的「官方」的XML架構驗證注意到它的任何問題。

下面的XML通過了對上述模式的驗證。

<?xml version="1.0" encoding="UTF-8"?> 
<c xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"> 
    x 
    <b/> 
    y 
</c> 

所以基本上你不能覆蓋複雜的基本類型的混合度。爲了進一步支持這個聲明,請嘗試交換基本類型和dervied類型的混合。在這種情況下,XML無法驗證,因爲派生類型不會被混合,因爲它(又是)不能覆蓋基本的混合。

你也說

有些解析器允許直接PCDATA的元素,而有的則沒有

它不能傷害澄清解析器你在說什麼哪。 A 解析器遇到混合內容時不應該失敗。如果架構不允許,遇到混合內容時,給定正確模式的驗證解析器將失敗。