javascript基础从小白到高手系列九百一十一:XSLTProcessor 类型

Mozilla 通过增加了一个新类型XSLTProcessor,在JavaScript 中实现了对XSLT 的支持。通过使用XSLTProcessor 类型,开发者可以使用XSLT 转换XML 文档,其方式类似于在IE 中使用XSL 处理
器。自从XSLTProcessor 首次实现以来,所有浏览器都照抄了其实现,从而使XSLTProcessor 成了
通过JavaScript 完成XSLT 转换的事实标准。
与IE 的实现一样,第一步是加载两个DOM文档:XML 文档和XSLT 文档。然后,使用import-
StyleSheet()方法创建一个新的XSLTProcessor,将XSLT 指定给它,如下所示:
let processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
最后一步是执行转换,有两种方式。如果想返回完整的DOM文档,就调用transformToDocument();
如果想得到文档片段,则可以调用transformToFragment()。一般来说,使用transformToFragment()
的唯一原因是想把结果添加到另一个DOM 文档。
如果使用transformToDocument(),只要传给它XML DOM,就可以将结果当作另一个完全不同
的DOM 来使用。比如:
let result = processor.transformToDocument(xmldom);
console.log(serializeXml(result));
transformToFragment()方法接收两个参数:要转换的XML DOM 和最终会拥有结果片段的文
档。这可以确保新文本片段可以在目标文档中使用。比如,可以把document 作为第二个参数,然后将
创建的片段添加到其页面元素中。比如:
let fragment = processor.transformToFragment(xmldom, document);
let div = document.getElementById(“divResult”);
div.appendChild(fragment);
这里,处理器创建了由document 对象所有的片段。这样就可以将片段添加到当前页面的


素中了。
如果XSLT 样式表的输出格式是"xml"或"html",则创建文档或文档片段理所当然。不过,如果输
出格式是"text",则通常意味着只想得到转换后的文本结果。然而,没有方法直接返回文本。在输出
格式为"text"时调用transformToDocument()会返回完整的XML 文档,但这个文档的内容会因浏
览器而异。比如,Safari 返回整个HTML 文档,而Opera 和Firefox 则返回只包含一个元素的文档,其中
输出就是该元素的文本。
解决方案是调用transformToFragment(),返回只有一个子节点、其中包含结果文本的文档片段。
之后,可以再使用以下代码取得文本:
let fragment = processor.transformToFragment(xmldom, document);
let text = fragment.firstChild.nodeValue;
console.log(text);
这种方式在所有支持的浏览器中都可以正确返回转换后的输出文本。
使用参数
XSLTProcessor 还允许使用setParameter()方法设置XSLT 参数。该方法接收三个参数:命名
空间URI、参数本地名称和要设置的值。通常,命名空间URI 是null,本地名称就是参数名称。
setParameter()方法必须在调用transformToDocument()或transformToFragment()之前调用。
例子如下:
let processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
processor.setParameter(null, “message”, “Hello World!”);
let result = processor.transformToDocument(xmldom);
与参数相关的还有两个方法:getParameter()和removeParameter()。它们分别用于取得参数
的当前值和移除参数的值。它们都以一个命名空间URI(同样,一般是null)和参数的本地名称为参
数。比如:
let processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
processor.setParameter(null, “message”, “Hello World!”);
console.log(processor.getParameter(null, “message”)); // 输出"Hello World!"
processor.removeParameter(null, “message”);
let result = processor.transformToDocument(xmldom);
这几个方法并不常用,只是为了操作方便。重置处理器
每个XSLTProcessor 实例都可以重用于多个转换,只是要使用不同的XSLT 样式表。处理器的
reset()方法可以删除所有参数和样式表。然后,可以使用importStylesheet()方法加载不同的
XSLT 样表,如下所示:
let processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
// 执行某些转换
processor.reset();
processor.importStylesheet(xsltdom2);
// 再执行一些转换
在使用多个样式表执行转换时,重用一个XSLTProcessor 可以节省内存。
小结
浏览器对使用JavaScript 处理XML 实现及相关技术相当支持。然而,由于早期缺少规范,常用的
功能出现了不同实现。DOM Level 2 提供了创建空XML 文档的API,但不能解析和序列化。浏览器为
解析和序列化XML 实现了两个新类型。
 DOMParser 类型是简单的对象,可以将XML 字符串解析为DOM 文档。
 XMLSerializer 类型执行相反操作,将DOM文档序列化为XML 字符串。
基于所有主流浏览器的实现,DOM Level 3 新增了针对XPath API 的规范。该API 可以让JavaScript
针对DOM 文档执行任何XPath 查询并得到不同数据类型的结果。
最后一个与XML 相关的技术是XSLT,目前并没有规范定义其API。Firefox 最早增加了XSLTProcessor
类型用于通过JavaScript 处理转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值