XSLT 处理在 Firefox 和 Chrome 上给出不同的结果

XSLT processing gives different result on Firefox and Chrome

我有一个由 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 逻辑从 xmlInput 获取 <bom>Value 1 for first block</bom>,但是当我使用

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

获取 outcome 变量 Chrome 未通过 results 标记进行解析,并在我的结果 div 中给出一个空标记。 Safari 也会发生同样的事情。

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

谁能告诉我,我做错了什么?这与某些 webkit 行为有关吗?

Chrome won't run locally loaded XSLT 出于安全考虑。您必须改为从服务器加载它。由于这个原因,Firefox 并不是那么特别,最终在开发过程中更好用。

相关


更新:

Martin Honnen 在下面的评论中正确指出,因为 OP 正在从嵌入 Javascript 中的字符串加载 XSLT,Chrome 应该 是 运行 本例中的 XSLT。深挖,果然,还有其他问题...

  • XML 格式不正确:F1-RetBOMs 的结束标记有一个 内部 space: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 中看到正确的结果。)