【问题标题】:XSLT processing gives different result on Firefox and ChromeXSLT 处理在 Firefox 和 Chrome 上给出不同的结果
【发布时间】:2015-07-18 07:00:05
【问题描述】:

我有一个由 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 获取&lt;bom&gt;Value 1 for first block&lt;/bom&gt;,但是当我使用时

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

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

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

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

【问题讨论】:

  • 你想达到什么目的?整个代码很奇怪,例如transformToDocument 接受一个参数而不是两个参数,所以我想知道你想用oProcessor.transformToDocument(xmldoc.documentElement, document) 实现什么。
  • 我可以告诉你当the fixes I identify 被创建并且文件被加载到浏览器中时会发生什么:一个空的蓝色框和一个“点击我”红色框出现。单击“单击我”将“第二个块的值 2”添加到蓝色框中。有粗糙的边缘,但它似乎是典型的基本探索/原型设计。
  • 空格不是问题,它们是通过在此处粘贴代码引入的。根本原因是“root”,因为 xpath 依赖于未定义的上下文。将 root 添加到 xpath 可以解决此问题。非常感谢 cmets。

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


【解决方案1】:

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

相关:XSLT not working in web browser


更新:

Martin Honnen 在下面的 cmets 中正确指出,由于 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 中也能看到正确的结果。)

【讨论】:

  • 问题中的示例从嵌入在 HTML 文档中的 Javascript 代码中的字符串加载 XSLT 和 XML 源代码,因此我认为与从文件加载 XML 文档无关的安全问题使用 Chrome 的系统可能是造成差异的原因。
  • 我已经尝试删除空格,我从 Fiddler 文本向导转换了这些文件。实际的 XML 和 XSL 是不同的,出于商业原因我不能在这里发布。问题出在 XPATH 上,如果我将 '$outcome' 替换为 'outcome' 变量的完整 XPATH,它可以工作并在 chrome 上给出与 FF 相同的结果。 xsl 和 xml 都来自我的应用程序中的服务器,这只是重新创建行为的尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2019-03-20
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多