DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 刪除多余的屬性 xmlns=
刪除多余的屬性 xmlns=
編輯:XML詳解     

很早前就遇到這個空值的屬性,它既出現在 Html 文檔中,也出現在 XML 中,一直都回避,放之任之,反正也不影響文檔的正確性。隱隱約約過了大半年,終於有一天下定決心,一定要把這個問題徹徹底底搞個透,認真一分析,卻發現這是一個 XML 命名空間基礎知識,不是一個需要捋起兩管衣袖再加深呼吸兩口才能解決的問題。

首先來重現此屬性,現有的XML數據(people.XML):

  1. <ROOT XMLns\="http://www.example.com">   
  2. <NAME>張三</NAME>   
  3. </ROOT>  

(注意上面的XMLns後面帶有一個反斜槓,是為了防止語法高亮組件SyntaxHighlighter異常而加的,請透明視之,以下同)程序給root增加一個age節點用於描述“張三”的年齡(VBScript):

  1. Dim dom    
  2. Set dom = CreateObject("MSXML2.DOMDocument")    
  3. dom.async = False   
  4. dom.load "people.XML"    
  5. Dim age    
  6. Set age = dom.createElement("age")    
  7. age.text = 25   
  8. dom.documentElement.appendChild age    
  9. dom.save "people.XML"  

修改後的 people.XML 如下:

  1. <ROOT XMLns\="http://www.example.com">   
  2. <NAME>張三</NAME>   
  3. <AGE XMLns="">25</AGE>   
  4. </ROOT>  

文檔的root節點定義了一個默認的命名空間 http://www.example.com,即root元素的所有子孫元素都在此空間之下(除非它們另行定義有空間)。程序創建 age 節點時沒有指明此節點具有哪個空間,即 age 的命名空間為空值,空值不等於 http://www.example.com,相當於 age 有自己的私有空間,它與父輩的空間不同,理所當然地會出現 XMLns 屬性。

要去除此屬性有兩個方法:

1.去除 age 祖先節點默認的命名空間

2.創建 age 節點時指明其空間為祖先定下的默認空間

第一種方案一般是不會被采納的,為了兒孫輩不太可能廢掉祖先定下的規矩。第二種方案最簡單:使用 createNode 方法替換 createElement 方法。

  1. .Set age = dom.createNode(1,"age","http://www.example.com")  

效果立現。

除了程序會遇到命名空間繼承的問題,xsl 模板中創建的元素也有此問題。比如創建元素:

  1. <XSL:ELEMENT name="a">   
  2. <XSL:ATTRIBUTE name="href">http://www.example.com</XSL:ATTRIBUTE>   
  3. <XSL:VALUE-OF select="'Hello world'" />   
  4. </XSL:ELEMENT>  

該 XSL 模板是由 Dreamweaver 創建,在經歷 XSL 處理器轉換後,輸出的 a 元素同樣也包含一個 XMLns="" 屬性。根本原因還是創建的元素與其祖先的命名空間不一致。用 Dreamweaver 創建一個空的 XSLT(整頁) 頁面,其根節點
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">

只聲明了名為 xsl 的空間,它用於實現所有的xslt元素: <xsl:xxxx />, 因此用 xsl 的方法創建出來的元素,它們的空間自然就在根節點聲明空間之下,該死的是根節點並沒有定義有默認空間,所以 xsl 方法創建的元素最終都將有一個 XMLns="" 屬性。

這裡需要注意到 XSLT 模板裡面的 html 元素為了適合 w3c 所推薦的 xHtml 標准,它聲明了一個默認空間
<html XMLns="http://www.w3.org/1999/xHtml"> 

這個空間是對最終的 Html 代碼有效的,它對 xslt 沒有任何作用。

解決的方法同樣有兩種:

1.給 xslt 頁面的根節點 xsl:stylesheet 聲明默認空間,令它與 Html 元素的默認空間值一致

2.使用 xsl 方法創建元素時指明其空間,只要空間與默認空間一致,就不會出現 XMLns=""

這裡推薦采用第一種方案,因為只需在 xsl 文檔的根節點聲明了與 Html 元素一致的默認命名空間,用 xsl 方法創建的元素就與祖先的空間一致,就不會出現 XMLns="",一勞永逸。

方法二就需要每次都使用

  1. <XSL:ELEMENT name="xx" namespace="http://www.w3.org/1999/xHtml">   
  2. ....   
  3. </XSL:ELEMENT>  

明顯第一種方案勝出。

繼續深入,怎樣讓 Dreamweaver 創建的 XSLT(整頁) 模板根元素 xsl:stylesheet 自動帶有默認命名空間XMLns="http://www.w3.org/1999/xHtml"。 

找到文件:
C:\Program Files\Adobe\Adobe Dreamweaver CS3\configuration\DocumentTypes\MMDocumentTypeDeclarations.XML
用記事本打開,在文件底部,可以看到 Dreamweaver 創建 xslt 頁面時所使用的模板,只需把默認的命名空間加在此處就 OK 了。

【編輯推薦】

  1. XML中的層疊樣式
  2. 打造基於 XSL 的模板框架
  3. 網站開發應該知道的事
  4. 數據庫開發10個最重要特點
  5. 認識基於中間件的軟件開發方法
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved