是否有一种方法可以传递(和使用)文档节点作为Edge和Chrome中的XSLTProcessor的参数?



我正在尝试在Edge中进行XSL转换,并使用文档节点作为xslt参数(通过XSLTProcessor.setParameter)。transformToFragment在Edge(和Chrome)中返回null,但在Firefox中工作正常。

是否有一种方法可以使下面的代码工作(至少在Edge中),或者不支持文档节点作为xslt参数?下面是一个最小的代码来表示这个问题。

https://jsfiddle.net/BennyHilarious/nxzLf9g3/1/

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<script type="text/javascript">
function example() {
let xsldocp = new DOMParser();
const xsldoc = xsldocp.parseFromString(`<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method='xml' omit-xml-declaration='yes'/>
<!-- Parameters -->
<xsl:param name='ntParam'/>
<xsl:param name='strSpaces' select='"&#32;&#32;&#32;&#32;"'/> <!-- Default to 4 spaces -->
<!-- Global variables -->
<xsl:variable name='numTransformLevel' select='$ntParam/PARAMETER/@VALUE'/> <!-- does not work in Edge & Chrome -->
<!--xsl:variable name='numTransformLevel' select='2'/--><!-- works OK -->
<!-- Handles a generic element node. -->
<xsl:template match='*'>
<div>
<b><xsl:value-of select='$numTransformLevel'/></b>
<i><xsl:value-of select='//GROOT/@VALUE'/></i>
</div>
</xsl:template>
</xsl:stylesheet>
`,"application/xml");

let xsltProcessor = new XSLTProcessor();
// use the xsl sheet
xsltProcessor.importStylesheet(xsldoc);
// create xml
let parser = new DOMParser();
const docData = parser.parseFromString("<ROOT><GROOT VALUE='IAM'/></ROOT>", "application/xml");

// create param xml and set the parameter
parser = new DOMParser();
const docParam = parser.parseFromString("<PARAM><PARAMETER VALUE='5'/></PARAM>", "application/xml");
xsltProcessor.setParameter(null, "ntParam", docParam.documentElement);
// do the transformation
var targetElm = document.getElementById("trCont5");
let resultFrag = xsltProcessor.transformToFragment(docData, targetElm.ownerDocument);
targetElm.appendChild( resultFrag );
}
</script>
</head>
<body>
<input type="button" onclick="example();" value="XLSTParam Test"/><!-- Outputs 5IAM -->
<div id="trCont5"></div>
</body>
</html>

使用SaxonJS(文档在https://www.saxonica.com/saxon-js/documentation2/index.html,下载在https://www.saxonica.com/download/javascript.xml):

function example() {
const xslt = `<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method='html'/>
<!-- Parameters -->
<xsl:param name='ntParam'/>
<xsl:param name='strSpaces' select='"&#32;&#32;&#32;&#32;"'/> <!-- Default to 4 spaces -->
<!-- Global variables -->
<xsl:variable name='numTransformLevel' select='$ntParam/PARAMETER/@VALUE'/> <!-- does not work in Edge & Chrome -->
<!--xsl:variable name='numTransformLevel' select='2'/--><!-- works OK -->
<!-- Handles a generic element node. -->
<xsl:template match='*'>
<div>
<b><xsl:value-of select='$numTransformLevel'/></b>
<i><xsl:value-of select='//GROOT/@VALUE'/></i>
</div>
</xsl:template>
</xsl:stylesheet>
`;            
// create xml
let parser = new DOMParser();
const docData = parser.parseFromString("<ROOT><GROOT VALUE='IAM'/></ROOT>", "application/xml");

// create param xml and set the parameter
const docParam = parser.parseFromString("<PARAM><PARAMETER VALUE='5'/></PARAM>", "application/xml");

// do the transformation
var targetElm = document.getElementById("trCont5");

let result = SaxonJS.XPath.evaluate(`
transform(map { 
'source-node' : .,
'stylesheet-text' : $xslt,
'stylesheet-params' : map {
QName('', 'ntParam') : $ntParam
}
})?output`,
docData,
{
'params' : { 
ntParam : docParam.documentElement,
xslt : xslt 
}
});
targetElm.appendChild( result );
}
</script>
</head>
<body>
<input type="button" onclick="example();" value="XLSTParam Test"/><!-- Outputs 5IAM -->
<div id="trCont5"></div>
</body>
<script src="https://martin-honnen.github.io/xslt3fiddle/js/SaxonJS2.js"></script>


<input type="button" onclick="example();" value="XSLTParam Test"/><!-- Outputs 5IAM -->
<div id="trCont5"></div>

注意,为了示例的紧凑性和自包含性,我使用SaxonJS.XPath.evaluate方法动态调用XPath 3.1transform函数来运行所提供的XSLT。SaxonJS还允许您使用SaxonJS.transform方法运行预编译的XSLT,为此您需要使用SaxonEE或Node.jsxslt3工具(来自Saxonica/NPM https://www.npmjs.com/package/xslt3)将XSLT文件编译为JSON文件。

最新更新