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文档的使用仍然是一