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=\""'"\"/> <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 中看到正确的结果。)
我有一个由 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=\""'"\"/> <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 中看到正确的结果。)