如何使用XSLT转换XML文档并在IE中添加参数?

时间:2011-04-04 02:09:00

标签: javascript xml xslt

我是学习XSLT的新手,我遇到了一些我真的不太了解的东西。我需要在转换文档之前添加一个XSLT参数。我可以为非IE浏览器这样做:

function loadXMLDoc(dname) {
    if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
    } else {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttp.open("GET", dname, false);
    xhttp.send("");
    return xhttp.responseXML;
}

function displayResult() {
    xml = loadXMLDoc("cdcatalog.xml");
    xsl = loadXMLDoc("cdcatalog.xsl");
    // code for IE
    if (window.ActiveXObject) {
        ex = xml.transformNode(xsl);
        document.getElementById("example").innerHTML = ex;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else if (document.implementation && document.implementation.createDocument) {
        xsltProcessor = new XSLTProcessor();
        xsltProcessor.importStylesheet(xsl);
        resultDocument = xsltProcessor.transformToFragment(xml, document);
        document.getElementById("example").appendChild(resultDocument);
    }
}

现在,我可以为非IE浏览器,新的XSLT Processor对象,导入样式表,只需在转换过程之前添加参数。虽然这个代码的IE版本似乎没有发生这种情况,但我不能简单地在转换之前添加参数。我大肆搜索并看到不同的东西告诉我创建各种不同MSXML版本的新ActiveX对象,我对整个事件深感困惑。

采取上述代码,我该怎么做:
xsltProcessor.setParameter(null,"PARAMNAME","PARAMVALUE");

除了IE之外,如果可能的话,有人可以解释IE如何处理整个XSLT概念与FF / O / C /其他文明浏览器的不同吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Sarissa,它是一个提供跨浏览器XSLT转换API的抽象层。

答案 1 :(得分:0)

根据this page,您可以使用

XSLTProcessor.addParameter("Parameter Name", "Parameter Value");

使用

创建XSLTProcessor
var XSLTCompiled = new ActiveXObject("MSXML2.XSLTemplate");
XSLTCompiled.stylesheet = XSL.documentElement;
var XSLTProcessor = XSLTCompiled.createProcessor();

变换调用也不同。

XSLTProcessor.transform();

无论如何,看起来对你要求的内容有一个非常精细的解释。

我做了跨浏览器的XSLT转换了一段时间,这是我使用的代码。 createDocument只是一个返回DOM文档的函数。我没有做样式表参数,所以也许这有点偏离主题,但无论如何它适用于IE6 +和Firefox 1.5 +。

// arguments can be string (uri of document) or document node
function xslTransform( content, transform, options )
{
    if ("string" == typeof content)   content = createDocument( content );
    if ("string" == typeof transform) transform = createDocument( transform );

    var targetEle;

    if (options && options.target) targetEle = document.getElementById(options.target);

    if (targetEle && options.replace)
        while (targetEle.hasChildNodes())
            targetEle.removeChild( targetEle.firstChild );

    if (window.XSLTProcessor)
    {
        var processor = new XSLTProcessor();
        processor.importStylesheet( transform );
        var frag = processor.transformToFragment( content, document );
        if (targetEle)
            targetEle.appendChild( frag );
    }
    else if (window.ActiveXObject)
    {
        if (targetEle)
            targetEle.innerHTML = content.transformNode( transform );
    }
    else return "XSLT not supported";
}