2009-05-31 116 views
1

我正在嘗試在XML模式中創建一個元素,以便只有標準(X)HTML元素可以用作子元素。我已經試過是這樣的:如何在允許任何HTML元素作爲子元素的XML模式中創建元素?

<xs:element name="description"> 
    <xs:complexType> 
     <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
      <xs:any namespace="http://www.w3.org/1999/xhtml" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

當然,這是不行的,如下面的XML沒有明確指定命名空間:

<description> 
    <p>this is a test</p> 
    <p>this is a <b>bold</b> test</p> 
    <h1>Those were the tests</h1> 
</description> 

我需要指定命名空間在文檔的某處,或者我可以在模式中獲取它?

回答

1

你的架構看起來確定。請注意,xs:any/@ processContents的默認值是嚴格的,這意味着您的XHTML元素也將被驗證,因此您還需要具有XHTML架構並從架構中導入它。您可以在xs:any中使用processContents =「lax」來指定僅在存在這些元素的模式時應用驗證。

您的問題在於您應該爲XHTML元素指定命名空間的情況。你可以聲明XHTML命名空間爲每個元素的默認命名空間,例如

<p xmlns="http://www.w3.org/1999/xhtml">this is a test</p> 

,或者你可以聲明其綁定到一個前綴,例如小時,然後使用該前綴來限定你的XHTML元素:

<description xmlns:h="http://www.w3.org/1999/xhtml"> 
    <h:p>this is a test</h:p> 
    <h:p>this is a <b>bold</b> test</h:p> 
    <h:h1>Those were the tests</h:h1> 
</description> 

DTD沒有名稱空間感知,並且namepsace聲明只是屬性,因此可以在元素上聲明一個固定的xmlns屬性以自動將它放入特定的名稱空間。 XML Schema是可識別名稱空間的,並且不能將名稱空間聲明作爲固定屬性。

2

我想你需要這樣禁用內容處理:

<xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip"/> 

section 5.5在XML Schema規範(尤其是例子)

+0

我希望有比說:「管它」更好的辦法。 – Eric 2009-05-31 16:53:25

+0

但是你必須忽略它,因爲它無效。在XML中使用正確的名稱空間不是可選的。 – 2009-05-31 17:23:47

+0

我希望模式可以告訴xml文檔命名空間是什麼。如果我要明確說明名稱空間,我該在哪裏做? – Eric 2009-05-31 18:14:58

相關問題