刪除多餘的屬性 xmlns=""

leintor發表於2012-08-04
    Xml是Internet環境中跨平臺的,依賴於內容的技術,是當前處理結構化文件資訊的有力工具。本文介紹了刪除XML中的多餘屬性的方法,透過例子驗證,哪一種方法更好。

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

    首先來重現此屬性,現有的XML資料(people.xml):

  1. <ROOT xmlns\="">   
  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\="">   
  2. <NAME>張三NAME>   
  3. <AGE xmlns="">25AGE>   
  4. ROOT>  

文件的root節點定義了一個預設的名稱空間 ,即root元素的所有子孫元素都在此空間之下(除非它們另行定義有空間)。程式建立 age 節點時沒有指明此節點具有哪個空間,即 age 的名稱空間為空值,空值不等於 ,相當於 age 有自己的私有空間,它與父輩的空間不同,理所當然地會出現 xmlns 屬性。

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

1.去除 age 祖先節點預設的名稱空間

2.建立 age 節點時指明其空間為祖先定下的預設空間

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

  1. .Set age = dom.createNode(1,"age","")  

效果立現。

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

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

該 XSL 模板是由 Dreamweaver 建立,在經歷 XSL 處理器轉換後,輸出的 a 元素同樣也包含一個 xmlns="" 屬性。根本原因還是建立的元素與其祖先的名稱空間不一致。用 Dreamweaver 建立一個空的 XSLT(整頁) 頁面,其根節點

只宣告瞭名為 xsl 的空間,它用於實現所有的xslt元素: , 因此用 xsl 的方法建立出來的元素,它們的空間自然就在根節點宣告空間之下,該死的是根節點並沒有定義有預設空間,所以 xsl 方法建立的元素最終都將有一個 xmlns="" 屬性。

這裡需要注意到 XSLT 模板裡面的 html 元素為了適合 w3c 所推薦的 xhtml 標準,它宣告瞭一個預設空間
 

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

解決的方法同樣有兩種:

1.給 xslt 頁面的根節點 xsl:stylesheet 宣告預設空間,令它與 html 元素的預設空間值一致

2.使用 xsl 方法建立元素時指明其空間,只要空間與預設空間一致,就不會出現 xmlns=""

這裡推薦採用第一種方案,因為只需在 xsl 文件的根節點宣告瞭與 html 元素一致的預設名稱空間,用 xsl 方法建立的元素就與祖先的空間一致,就不會出現 xmlns="",一勞永逸。

方法二就需要每次都使用

  1. <XSL:ELEMENT name="xx" namespace="">   
  2. ....   
  3. XSL:ELEMENT>  

明顯第一種方案勝出。

繼續深入,怎樣讓 Dreamweaver 建立的 XSLT(整頁) 模板根元素 xsl:stylesheet 自動帶有預設名稱空間xmlns=""。 

找到檔案:
C:\Program Files\Adobe\Adobe Dreamweaver CS3\configuration\DocumentTypes\MMDocumentTypeDeclarations.xml
用記事本開啟,在檔案底部,可以看到 Dreamweaver 建立 xslt 頁面時所使用的模板,只需把預設的名稱空間加在此處就 OK 了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20200170/viewspace-739840/,如需轉載,請註明出處,否則將追究法律責任。

相關文章