Javascript 如何使用变量在Chrome中执行XSLT转换
我正在尝试进行XSL转换 但是,每当引用带有文档片段的变量时,转换似乎都会失败 我创建了一个示例来演示这个问题。示例中的XML是允许XSLT运行的虚拟文档 我做错了什么 Javascript:Javascript 如何使用变量在Chrome中执行XSLT转换,javascript,xml,xslt,Javascript,Xml,Xslt,我正在尝试进行XSL转换 但是,每当引用带有文档片段的变量时,转换似乎都会失败 我创建了一个示例来演示这个问题。示例中的XML是允许XSLT运行的虚拟文档 我做错了什么 Javascript: var xml = [ '<p xmlns="http://www.w3.org/1999/xhtml">', '<\/p>' ].join('\n'); var xsl = [ '<xsl:stylesheet xmlns:xsl="htt
var xml = [
'<p xmlns="http://www.w3.org/1999/xhtml">',
'<\/p>'
].join('\n');
var xsl = [
'<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">',
'<xsl:variable name="xmlVar">',
'<aaaa value="It works"\/>',
'<\/xsl:variable>',
'<xsl:template match="\/">',
'<ROOT>',
//works ok after commenting out
'<xsl:value-of select="$xmlVar\/aaaa\/@value"\/>',
'<\/ROOT>',
'<\/xsl:template>',
'<\/xsl:stylesheet>'
].join('\n');
var domParser = new DOMParser();
var xmlDoc = domParser.parseFromString(xml, 'application/xml');
var xslDoc = domParser.parseFromString(xsl, 'application/xml');
var xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
try{
var result = xsltProc.transformToFragment(xmlDoc, document);
} catch(exc) {
document.getElementById('error').innerHTML = exc;
}
function encodeStr(rawStr) { return rawStr.replace(/[\u00A0-\u9999<>\&]/gim,
function(i){
return '&#'+i.charCodeAt(0)+';'
});
}
document.getElementById('xslText').innerHTML = encodeStr(xsl);
document.getElementById('result').innerHTML = encodeStr((new XMLSerializer).serializeToString(result));
var-xml=[
“',
''
].join('\n');
var xsl=[
'',
'',
'',
'',
'',
'',
//评论出来后效果还可以
'',
'',
'',
''
].join('\n');
var domParser=新的domParser();
var xmlDoc=domParser.parseFromString(xml,'application/xml');
var xslDoc=domParser.parseFromString(xsl,'application/xml');
var xsltProc=new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
试一试{
var result=xsltProc.transformToFragment(xmlDoc,document);
}捕获(exc){
document.getElementById('error')。innerHTML=exc;
}
函数encodeStr(rawStr){返回rawStr.replace(/[\u00A0-\u9999\&]/gim,
职能(一){
返回“”+i.charCodeAt(0)+”
});
}
document.getElementById('xslText').innerHTML=encodeStr(xsl);
document.getElementById('result').innerHTML=encodeStr((新的XMLSerializer.serializeToString(result));
HTML:
在XSLT 1.0中,您需要使用扩展函数,如
exsl:node set
(),将result tree fragment()类型的变量值转换为节点集,以便能够在节点上使用XPath,例如
var-xml=[
“',
''
].join('\n');
var xsl=[
'',
'',
'',
'',
'',
'',
'',
'',
'',
''
].join('\n');
var domParser=新的domParser();
var xmlDoc=domParser.parseFromString(xml,'application/xml');
var xslDoc=domParser.parseFromString(xsl,'application/xml');
var xsltProc=new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
试一试{
var result=xsltProc.transformToFragment(xmlDoc,document);
document.getElementById('result').appendChild(result);
}捕获(exc){
document.getElementById('error')。innerHTML=exc;
}
在XSLT 1.0中,您需要使用扩展函数,如
exsl:node set
(),将result tree fragment()类型的变量值转换为节点集,以便能够在节点上使用XPath,例如
var-xml=[
“',
''
].join('\n');
var xsl=[
'',
'',
'',
'',
'',
'',
'',
'',
'',
''
].join('\n');
var domParser=新的domParser();
var xmlDoc=domParser.parseFromString(xml,'application/xml');
var xslDoc=domParser.parseFromString(xsl,'application/xml');
var xsltProc=new XSLTProcessor();
xsltProc.importStylesheet(xslDoc);
试一试{
var result=xsltProc.transformToFragment(xmlDoc,document);
document.getElementById('result').appendChild(result);
}捕获(exc){
document.getElementById('error')。innerHTML=exc;
}
btw,firefox正在抛出“无数据”异常。铬是无声的。如果这有帮助的话,顺便说一句,firefox抛出了“无数据”异常。铬是无声的。如果这有帮助的话,那就太好了,非常感谢。我正在考虑如何解决糟糕的跨浏览器支持问题,现在就开始测试。Martin,我将尝试操纵XSL以实现我的案例的跨浏览器支持。如果它不起作用,我将只创建两组模板,一个用于IE,另一个用于其他浏览器…像往常一样。虽然在这种情况下,它看起来不像IE的故障。非常感谢你的帮助!对跨浏览器支持的更多赞誉!看起来不错,非常感谢。我正在考虑如何解决糟糕的跨浏览器支持问题,现在就开始测试。Martin,我将尝试操纵XSL以实现我的案例的跨浏览器支持。如果它不起作用,我将只创建两组模板,一个用于IE,另一个用于其他浏览器…像往常一样。虽然在这种情况下,它看起来不像IE的故障。非常感谢你的帮助!对跨浏览器支持的更多赞誉!
<pre id='xslText'>
</pre>
<pre id='result'>
</pre>
<pre id='error'>
</pre>