18.JavaScript 与XML(2)

本文详细介绍了JavaScript如何处理XSLT转换,包括在IE中通过ActiveX对象实现简单的和复杂的转换,以及在Firefox、Chrome等浏览器中使用XSLTProcessor进行转换。通过示例代码展示了设置参数、重置处理器以及跨浏览器兼容性的处理方法。
摘要由CSDN通过智能技术生成

3.浏览器对XSLT 的支持:XSLT 是与XML 相关的一种技术,它利用XPath 将文档从一种表现形式转换成另一种表现形式。与XML 和XPath 不同,XSLT 没有正式的API,在正式的DOM 规范中也没有它的位置。结果,只能依靠浏览器开发商以自己的方式来实现它。IE 是第一个支持通过JavaScript 处理XSLT 的浏览器。

  • IE中的XSLT:与IE 对其他XML 功能的支持一样,它对XSLT 的支持也是通过ActiveX 对象实现的。从MSXML 3.0(即IE6.0)时代起,IE 就支持通过JavaScript 实现完整的XSLT 1.0 操作。IE9 中通过DOMParser 创建的DOM 文档不能使用XSLT。

1. 简单的XSLT 转换:使用XSLT 样式表转换XML 文档的最简单方式,就是将它们分别加到一个DOM 文档中,然后再使用transformNode()方法。这个方法存在于文档的所有节点中,它接受一个参数,即包含XSLT 样式表的文档。调用transformNode()方法会返回一个包含转换信息的字符串。来看一个例子。

//加载XML 和XSLT(仅限于IE)
xmldom.load("employees.xml");
xsltdom.load("employees.xslt");
//转换
var result = xmldom.transformNode(xsltdom);

这个例子加载了一个XML 的DOM 文档和一个XSLT 样式表的DOM 文档。然后,在XML 文档节点上调用了transformNode()方法,并传入XSLT。变量result 中最后就会保存一个转换之后得到的字符串。需要注意的是,由于是在文档节点级别上调用的transformNode(),因此转换是从文档节点开始的。实际上,XSLT 转换可以在文档的任何级别上进行,只要在想要开始转换的节点上调用transformNode()方法即可。下面我们来看一个例子。

result = xmldom.documentElement.transformNode(xsltdom);
result = xmldom.documentElement.childNodes[1].transformNode(xsltdom);
result = xmldom.getElementsByTagName("name")[0].transformNode(xsltdom);
result = xmldom.documentElement.firstChild.lastChild.transformNode(xsltdom);

如果不是在文档元素上调用transformNode(),那么转换就会从调用节点上面开始。不过,XSLT样式表则始终都可以针对调用节点所在的整个XML 文档,而无需更换。

2. 复杂的XSLT 转换:虽然transformNode()方法提供了基本的XSLT 转换能力,但还有使用这种语言的更复杂的方式。为此,必须要使用XSL 模板和XSL 处理器。第一步是要把XSLT 样式表加载到一个线程安全的XML文档中。而这可以通过使用ActiveX 对象MSXML2.FreeThreadedDOMDocument 来做到。这个ActiveX对象与IE 中常规的DOM 支持相同的接口。此外,创建这个对象时应该尽可能使用最新的版本。例如:

function createThreadSafeDocument(){
	if (typeof arguments.callee.activeXString != "string"){
		var versions = ["MSXML2.FreeThreadedDOMDocument.6.0", 
"MSXML2.FreeThreadedDOMDocument.3.0", "MSXML2.FreeThreadedDOMDocument"],
		i, len;
		for (i=0,len=versions.length; i < len; i++){
			try {
				new ActiveXObject(versions[i]);
				arguments.callee.activeXString = versions[i];
				break;
			} catch (ex){
				//跳过
			}
		}
	}
	return new ActiveXObject(arguments.callee.activeXString);
}

除了签名不同之外,线程安全的XML DOM文档与常规XML DOM文档的使用仍然是一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值