需要一些小帮助来创建一个带参数的函数,该函数可以在我的模板中使用。尝试了很多方法,但都没有成功。下面是我的示例代码:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:math="http://exslt.org/math"
xmlns:func="http://exslt.org/functions"
xmlns:my="http://exslt.org/my"
exclude-result-prefixes="my"
extension-element-prefixes="my math func">
<xsl:output indent="yes" method="xml" />
<xsl:variable name="functionTest11">
<xsl:value-of select="my:calXY('aa')" />
</xsl:variable>
<xsl:template match="/">
<svg xmlns="http://www.w3.org/2000/svg">
<xsl:variable name="functionTest22">
<xsl:value-of select="my:calXY" />
</xsl:variable>
<xsl:comment>functionTest <xsl:copy-of
select="$functionTest22" /></xsl:comment>
</svg>
</xsl:template>
<func:function name="my:calXY">
<xsl:comment>functionHello </xsl:comment>
<xsl:param name="string1" select="''"/>
<func:result>
<xsl:value-of select="concat(10,'|',10)" />
</func:result>
</func:function>
</xsl:stylesheet>
据我所知,我无法方便地访问Xalan,它似乎是您正在使用的XSLT处理器。因此,我无法检验关于你问题起因的任何猜测。
但是,如果在第一个(也是唯一一个)xsl:param
之前放一个像xsl:comment
这样的输出指令是正确的,我会感到非常惊讶。(让我惊讶的是,你没有报告来自样式表编译器的任何错误消息。但从你引用的错误消息中可以清楚地看出,Xalan没有成功编译函数。)目前还不清楚你想通过让函数返回注释节点和字符串值"10|10"来实现什么,但这可能不是实现它的方法。
假设xsl:comment
指令是为了验证函数是否已经被求值,我会尝试类似的方法
<func:function name="my:calXY">
<xsl:param name="string1" select="''"/>
<func:result select="concat(10,'|',10)" />
</
[在这个答案的早期版本中,我推测这里不需要func:result
;我的错误。它似乎确实需要。]
您需要一个完整的样式表。使用xsltproc运行时,以下样式表的功能与预期一致。(正如我上面提到的,我没有一个方便的方法来运行Xalan。)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:func="http://exslt.org/functions"
xmlns:my="http://example.org/my"
exclude-result-prefixes="my"
extension-element-prefixes="func">
<xsl:output indent="yes" method="xml" />
<xsl:template match="/">
<xsl:message>Result is <xsl:value-of select="my:dummy('foo')"/></xsl:message>
<output>
<test><xsl:value-of select="my:dummy('bar')"/></test>
<test><xsl:value-of select="my:dummy('baz')"/></test>
</output>
</xsl:template>
<func:function name="my:dummy">
<xsl:param name="s" select="'foo'"/>
<func:result select="concat($s,'|',$s)" />
</func:function>
</xsl:stylesheet>