删除多余的属性 xmlns=""

开发
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。本文介绍了删除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. 认识基于中间件的软件开发方法
责任编辑:于铁 来源: 笛子的博客
相关推荐

2010-04-30 10:59:11

Unix Swap

2012-02-15 11:03:25

手机拍照图像处理

2010-02-23 09:59:11

Windows 7删除多于账户

2021-05-10 08:45:34

JavaScript开发对象

2011-03-03 09:42:13

PureFTPd

2021-03-26 23:41:19

JavaScript对象开发

2012-02-14 13:42:22

云计算云存储

2012-02-13 09:11:13

云存储云计算

2010-04-20 14:47:07

Windows 7关机

2023-10-13 08:00:00

网络层开发

2010-03-23 08:46:07

Windows 7系统优化

2024-11-18 11:20:00

视频大模型

2023-11-01 10:59:13

数据中心服务器

2009-07-27 16:43:51

自定义Eclipse菜

2021-10-20 09:24:47

Windows性能微软

2010-12-01 10:49:52

Google App

2013-08-09 09:49:08

云计算IT

2023-11-20 14:41:34

Python属性

2023-12-01 10:20:04

Python类属性

2021-11-29 10:55:11

线程池Java面试
点赞
收藏

51CTO技术栈公众号