在创建带参数的函数时需要一些帮助,并且可以在我的模板中使用该函数。尝试了很多事情但没有任何结果。以下是我的示例代码:
<?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:comment
之前放置像xsl:param
这样的输出指令是正确的,我会大吃一惊。 (令我惊讶的是,您没有报告来自样式表编译器的任何错误消息。但是从您引用的错误消息中可以清楚地看出,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>