删除多余的属性 xmlns=""
作者:快乐笛子 来源:快乐笛子blog 发布时间:2010-08-24 18:41:00
很早前就遇到这个空值的属性,它既出现在 html 文档中,也出现在 xml 中,一直都回避,放之任之,反正也不影响文档的正确性。隐隐约约过了大半年,终于有一天下定决心,一定要把这个问题彻彻底底搞个透,认真一分析,却发现这是一个 xml 命名空间基础知识,不是一个需要捋起两管衣袖再加深呼吸两口才能解决的问题。
首先来重现此属性,现有的XML数据(people.xml):
<ROOT xmlns\="http://www.example.com">
<NAME>张三</NAME>
</ROOT>(注意上面的xmlns后面带有一个反斜杠,是为了防止语法高亮组件SyntaxHighlighter异常而加的,请透明视之,以下同)程序给root增加一个age节点用于描述“张三”的年龄(VBScript):
Dim dom Set dom = CreateObject("MSXML2.DOMDocument") dom.async = False dom.load "people.xml" Dim age Set age = dom.createElement("age") age.text = 25 dom.documentElement.appendChild age dom.save "people.xml" 修改后的 people.xml 如下:
<ROOT xmlns\="http://www.example.com">
<NAME>张三</NAME>
<AGE xmlns="">25</AGE>
</ROOT> 文档的root节点定义了一个默认的命名空间 http://www.example.com,即root元素的所有子孙元素都在此空间之下(除非它们另行定义有空间)。程序创建 age 节点时没有指明此节点具有哪个空间,即 age 的命名空间为空值,空值不等于 http://www.example.com,相当于 age 有自己的私有空间,它与父辈的空间不同,理所当然地会出现 xmlns 属性。要去除此属性有两个方法:
去除 age 祖先节点默认的命名空间
创建 age 节点时指明其空间为祖先定下的默认空间
第一种方案一般是不会被采纳的,为了儿孙辈不太可能废掉祖先定下的规矩。第二种方案最简单:使用 createNode 方法替换 createElement 方法。
Set age = dom.createNode(1,"age","http://www.example.com") 效果立现。
除了程序会遇到命名空间继承的问题,xsl 模板中创建的元素也有此问题。比如创建元素:
<?xml:namespace prefix = xsl /><xsl:element name="a">
<xsl:attribute name="href">http://www.example.com</xsl:attribute>
<xsl:value-of select="'Hello world'"></xsl:value-of>
</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 没有任何作用。
解决的方法同样有两种:
给 xslt 页面的根节点 xsl:stylesheet 声明默认空间,令它与 html 元素的默认空间值一致
使用 xsl 方法创建元素时指明其空间,只要空间与默认空间一致,就不会出现 xmlns=""
这里推荐采用第一种方案,因为只需在 xsl 文档的根节点声明了与 html 元素一致的默认命名空间,用 xsl 方法创建的元素就与祖先的空间一致,就不会出现 xmlns="",一劳永逸。
方法二就需要每次都使用
<?xml:namespace prefix = xsl />
<xsl:element name="xx" namespace="http://www.w3.org/1999/xhtml">
...
</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 了。 猛击此处下载修改后的文件,下载解压后覆盖原文件即可。
猜你喜欢
- layer弹出窗口在弹出时指定了area,弹出后,如果当前页面(iframe)大小比弹出的窗口小,那么就会出现无法操作弹出窗口的尴尬情况。如
- 如下所示:def usage(): print(' * usage:') print(' *
- Python 中的 Operator 模块可以让它支持函数式编程。1 计算函数假设我们需要一个计算阶乘的函数,一般做法是使用递归。如果使用函
- 去腾讯招聘网的信息,这个小项目有人做过,本着一个新手学习的目的,所以自己也来做着玩玩,大家可以参考一下。这里使用的是调用cmdline命令来
- 什么是孪生神经网络最近学习了一下如何比较两张图片的相似性,用到了孪生神经网络,一起来学习一下。简单来说,孪生神经网络(Siamese net
- 一、 通过runtime包进行多核设置1.NumCPU()获取当前系统的cpu核数2.GOMAXPROCS设置当前程序运行时占用的cpu核数
- 数据采集我们上一篇介绍了,如何采集王者皮肤,买不起皮肤,当个桌面壁纸挺好的。我们今天来学习如何采集电影评论,看看这个电影好不好看。发送请求我
- 找到自己的mysql数据库的安装位置,如下 C:\Program Files\MySQL\MySQL Server 5.1,在它里面有个的m
- 本文实例讲述了Android基于TCP和URL协议的网络编程。分享给大家供大家参考,具体如下:手机本身是作为手机终端使用的,因此它的计算能力
- 前言:随着移动端的普及出现了很多的移动 APP,应用软件也随之流行起来。最近又捡起来了英雄联盟手游,感觉还行,PC 端英雄联盟可谓是爆火的游
- 很多人在群里问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待。殊不知
- AutoGrad 是一个老少皆宜的 Python 梯度计算模块。对于初高中生而言,它可以用来轻易计算一条曲线在任意一个点上的斜率。对于大学生
- 1.ResNet的创新现在重新稍微系统的介绍一下ResNet网络结构。 ResNet结构首先通过一个卷积层然后有一个池化层,然后通过一系列的
- 利用numpy库(缺点:有缺失值就无法读取)读:import numpy my_matrix = numpy.loadtxt(open(&q
- 手残删除python补救新建文件夹,下载下面的依赖wget http://vault.centos.org/7.2.1511/o
- NTP(Network Time Protocol)是由美国德拉瓦大学的David L. Mills教授于1985年提出,设计用来在Inte
- AJAX 客户端页面代码: index.html <html> <body> <h1>Ajax file
- 首先我的环境已配置好:GO的目录结构是:add.gopackage calc//函数名必须大写首字母,不然外部包找不到func Add(a
- 本文研究的主要是Python进程间通信Queue的相关实例,具体如下。1.Queue使用方法:Queue.qsize():返回当前队列包含的
- SQL Server定位于中型的数据库应用,操作较Oracle和MySQL等要相对简便,SQL Server在处理海量数据的效率,后台开发的