我有一个由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逻辑从<bom>Value 1 for first block</bom>
获取xmlInput
但是当我使用时
<xsl:copy-of select=\"$outcome\"/>
获取outcome
变量Chrome未通过results
标记进行解析,并在结果div
中提供空标记。 Safari也是如此。
您可以在HTML文件中尝试整个代码,并查看不同的浏览器行为。
任何人都可以告诉我,我做错了什么?这与某些webkit行为有关吗?
答案 0 :(得分:0)
Chrome won't run locally loaded XSLT由于安全问题。您必须从服务器加载它。 Firefox并不是那么特别,因此在开发过程中最好使用它。
相关:XSLT not working in web browser
Martin Honnen在下面的评论中正确地指出,因为OP是从嵌入在Javascript中的字符串加载XSLT,所以Chrome 应该在这种情况下运行XSLT。深入挖掘,当然还有其他问题......
F1-RetBOMs
的结束标记有
内部空间:F1- RetBOMs
F1- RetBOMs/selectBOM/results[2]/bom
应该是F1-RetBOMs/selectBOM/results[2]/bom
F1-RetBOMs/selectBOM/results[2]/bom
应该是/root/F1-RetBOMs/selectBOM/results[2]/bom
当您应用上述修补程序时,您应该会在Chrome和Firefox中看到相同的结果。 (坦率地说,我怀疑你以前在Firefox中会看到正确的结果。)