如何使XSLT Javascript扩展函数返回节点集?
作者:互联网
有没有一种简单的方法在javascript中用Xavascript编写的扩展函数返回一个节点集?
我可以为此创建一个新的java类,但我宁愿在脚本本身中放入一些代码.
当这可以用所有或大多数XSLT处理器支持的另一种脚本语言(VB脚本?Groovy?C#?)来完成时,那当然也没关系.
我有以下简单的脚本:
<msxsl:script language="JScript" implements-prefix="custom">
function xml (input) {
var x = input.split(";");
return x.toString();
}
</msxsl:script>
它返回一个字符串,因此在Xpath表达式中调用该函数没有问题.
我想要的是一个节点集结果.但是当我改变我的脚本时
<msxsl:script language="JScript" implements-prefix="custom">
function xml (input) {
var x = input.split(";");
return x;
}
</msxsl:script>
然后调用该函数会产生错误,因为该数组不会自动转换为节点集.
我看了arrays-with-java-xslt-extensions,但更多的是为此创建一个新类,我希望现在避免.
那么应该将哪些语句添加到脚本中以将数组转换为节点集,从而允许在Xpath表达式中使用函数调用?
解决方法:
Here is an example应该与MSXML 6一起使用,只要在允许XSLT中的脚本实现扩展功能的模式下运行.
样式表代码如下:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:my="http://example.com/my"
exclude-result-prefixes="ms my">
<xsl:output method="html" version="5.0"/>
<ms:script language="JScript" implements-prefix="my">
<![CDATA[
function tokenize (input) {
var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
var fragment = doc.createDocumentFragment();
var tokens = input.split(';');
for (var i = 0, l = tokens.length; i < l; i++)
{
var item = doc.createElement('item');
item.text = tokens[i];
fragment.appendChild(item);
}
return fragment.selectNodes('item');
}
]]>
</ms:script>
<xsl:template match="/">
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Example</h1>
<ul>
<xsl:apply-templates select="my:tokenize('Kibology;for;all')"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="."/>
</li>
</xsl:template>
</xsl:stylesheet>
标签:xslt-1-0,node-set,javascript,xslt,exslt 来源: https://codeday.me/bug/20190929/1832576.html