XSLT处理在Firefox和Chrome上提供了不同的结果

时间:2015-05-07 15:30:23

标签: xml google-chrome xslt xml-parsing webkit

我有一个由XSLT处理的XML,但Mozilla Firefox 24 ESR正确解析我的XML,而Google Chrome 42无法从XML获取节点。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script>

var xslInput = "<xsl:stylesheet  xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\"> <xsl:output   method=\"xml\"/> <xsl:variable name=\"outcome\" select=\"F1- RetBOMs/selectBOM/results[2]/bom\"/><xsl:variable name=\"SINGLE_QUOTE\"  select=\"&quot;'&quot;\"/> <xsl:template match=\"/*\"> <result> <xsl:copy-of  select=\"$outcome\"/> </result></xsl:template> </xsl:stylesheet>" ;

var xmlInput = "<root><F1-RetBOMs><selectBOM><results><bom>Value 1 for first  block</bom><description>Description 1 for first block</description></results> <results><bom>Value 2 for second block</bom><description>Description 2 for  second block</description></results><rowCount>2</rowCount></selectBOM></F1- RetBOMs></root>";

function createXMLDoc(xmlText){
var parser = new DOMParser();
    if (xmlText) {
        xmlDoc = parser.parseFromString(xmlText, 'text/xml');
    } else {
        xmlDoc = document.implementation.createDocument('', '', null);
    }

    return xmlDoc;
}

function convertXSL(){
    var xmldoc = createXMLDoc(xmlInput);
    var xsldoc = createXMLDoc(xslInput);
    var oProcessor = new XSLTProcessor();
    oProcessor.importStylesheet(xsldoc);
    try{
        var outputDoc =   oProcessor.transformToDocument(xmldoc.documentElement, document);
    }catch(e){
        //console.log(e);
    }


    document.getElementById('result').innerHTML = new XMLSerializer().serializeToString(outputDoc);
}

</script>
</head>
<title></title>
<body>
<div id="result" style="min-height:300px; min-width: 400px; border: 1px solid blue"></div>
<span id="clickme" style="min-height:30px; min-width: 40px; border: 1px  solid red" onclick="convertXSL()">Click Me</span>
</body>
</html>

我试图通过XSLT逻辑从<bom>Value 1 for first block</bom>获取xmlInput但是当我使用时

<xsl:copy-of select=\"$outcome\"/>

获取outcome变量Chrome未通过results标记进行解析,并在结果div中提供空标记。 Safari也是如此。

您可以在HTML文件中尝试整个代码,并查看不同的浏览器行为。

任何人都可以告诉我,我做错了什么?这与某些webkit行为有关吗?

1 个答案:

答案 0 :(得分:0)

Chrome won't run locally loaded XSLT由于安全问题。您必须从服务器加载它。 Firefox并不是那么特别,因此在开发过程中最好使用它。

相关XSLT not working in web browser

更新

Martin Honnen在下面的评论中正确地指出,因为OP是从嵌入在Javascript中的字符串加载XSLT,所以Chrome 应该在这种情况下运行XSLT。深入挖掘,当然还有其他问题......

  • XML格式不正确:F1-RetBOMs的结束标记有 内部空间:F1- RetBOMs
  • XSLT XPath有类似的问题:F1- RetBOMs/selectBOM/results[2]/bom 应该是F1-RetBOMs/selectBOM/results[2]/bom
  • XSLT XPath还依赖于未定义的上下文:F1-RetBOMs/selectBOM/results[2]/bom 应该是/root/F1-RetBOMs/selectBOM/results[2]/bom

当您应用上述修补程序时,您应该会在Chrome和Firefox中看到相同的结果。 (坦率地说,我怀疑你以前在Firefox中会看到正确的结果。)