JavaScript JavaScript与XML——“XSLT”的注重要点

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);
    原文作者:JS菌
    原文地址: https://segmentfault.com/a/1190000004477166
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞