IE中的XSTL
它不是一种正式的范例,, 是XPath的另一表现形式。 IE是第一个支撑它的。
简朴的XSTL转换
XML文档的体式格局就是将它们离别加到一个DOM文档中, 然后运用
transformNode()
要领。
这个要领吸收一个参数, 即包括XSTL样式表的文档。 挪用这个要领以后会返回一个包括转换信息的字符串。
xmldom.load("employees.xml");
xstldom.load("employees.xstl");
var result = xmldom.transformNodes(xstldom);
这个transformNode的参数可所以XML文档的DOM节点。 假如不是在文档元素上挪用transformNode, 那末转换就会从挪用节点上最先。
庞杂的XSLT转换
要运用庞杂的XSTL转换, 必需运用XSL模板和XSL处置惩罚器。 先要把XSTL样式表加载到一个线程平安的XML文档中。
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) {
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
建立XSTL模板:
function createXSTLTemplate() {
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) {
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
下面是运用示例:
var xsltdom = createThreadSafeDocument();
xstldom.async = false;
xsltdom.load("employees.xslt");
var template = createXSTLTemplate();
template.stylesheet = xstldom;
var processor = tempalte.createProcessor();
processor.input = xmldom;
processor.transform();
var result = processor.output;
在建立了XSL处置惩罚器以后, 必需将要转换的节点指定给input属性。 这个值可所以一个文档, 也可所以文档的任何节点。 然后挪用transform要领即可实行转换并将效果作为字符串保存在output属性中。 这些代码完成了transformNode雷同的功用。 运用XSL处置惩罚器可以对转换举行更多的掌握, 同时也支撑更高等的XSTL特征。
要将样式表中的参数举行赋值处置惩罚, 可以运用addParaneter() 要领, 它吸收两个参数: 要设置的参数称号和要指定的值。
processor.input = xmldom.documentElement;
processor.addParameter("message", "Hello wrold!");
processor.transform();
XSL处置惩罚器的另一个高等特征是可以设置一种操纵形式。 在XSTL中, 可以运用mode特征为模板定义一种形式在定义了形式以后, 假如没有将 < xsl: apply – tempaltes > 与婚配的mode特征一同运用, 就不会运转该模板。 假如在 < xsl: apply – tempaltes > 元素的形式设置为“ title – first”, 那末在javascript运用时就需要像下面如许举行设置:
processor.input = xmldom;
processor.addParameter("message", "Hello wrold!");
processor.setStartMode("title-first");
processor.transform();
假如盘算用一个XSTL样式表举行屡次转换, 可以在每次转换以后挪用reset() 要领重置处置惩罚器。
processor.reset();
由于处置惩罚器已编译了XSTL样式表, 与transformNode() 比拟, 如许的转换速率会更快一些
XSLTProcessor范例
Mozilla经由过程火狐建立新范例, 其他非IE浏览器自创了它, 也完成了这个范例。 重要的功用是用来将XSLT转换为XML文档。
第一步加载DOM文档, 一个基于XML, 另一个基于XSLT。 然后建立一个新XSLTProceesor对象, 并运用importStylesheet() 要领为其指定一个XSLT。 示例:
var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
末了一步是实行转换。 这一步有两种差别的体式格局: 假如想返回一个完全的DOM文档, 可以挪用
transformToDocument()
;
假如想返回一个文档片断, 可以运用
transformToFragment()
。
transformToDocument() 的参数是一个XML DOM。 transformToFragment() 的参数有两个, 第一个是XML DOM, 第二个是具有该文档片断的文档。
setParameter()
要领可以用来设置XSLT的参数, 该要领吸收三个参数: 定名空间URI, 参数的内部称号和要设置的值。 这个要领必需在举行末了一步转化之前挪用。getParameter()
要领用于获得当前参数的值, 参数为定名空间URI和参数的内部称号。removeParameter()
要领用于移除当前参数的值, 参数为定名空间URI和参数的内部称号。
背面两个要领并不经常使用, 供应他们只是为了轻易。
重置处置惩罚器的要领是reset()
要领。
跨浏览器运用XSLT
function transform(context, xslt) {
if (typeof XSLTProcessor != "undefined") {
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var result = processor.transformToDocument(context);
return (new XMLSerializer()).serializeToString(result);
} else if (typeof context.transformNode != "undefined") {
return caontext.transformNode(xslt);
} else {
throw new Error("No XSLT processor available.");
}
}
这个函数吸收两个参数: 要实行转换的上下文节点和XSLT文档对象。 返回序列化以后的字符串。
var result = transform(xmldom, xsltdom);