func:function
我试图通过使用 EXSLT 的元素来实现一个“三元运算符”扩展函数,以便在我的样式表中使用。出于兼容性原因,我必须使用 XSLT 1.0。我想出了这个:
<func:function name="myext:ternary">
<xsl:param name="expr" />
<xsl:param name="ifTrue" />
<xsl:param name="ifFalse" />
<func:result>
<xsl:choose>
<xsl:when test="boolean($expr)"><xsl:value-of select="$ifTrue"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$ifFalse" /></xsl:otherwise>
</xsl:choose>
</func:result>
</func:function>
无论我在哪里使用它都可以正常工作。但是,我也尝试实现一个 substring-after-last 函数(从这里开始)。此代码工作正常:
<func:function name="myext:substring-after-last">
<xsl:param name="string" select="''"/>
<xsl:param name="delimiter" select="$d" />
<func:result>
<xsl:choose>
<xsl:when test="contains($string, $delimiter)">
<xsl:value-of select="myext:substring-after-last(substring-after($string, $delimiter), $delimiter)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
</xsl:otherwise>
</xsl:choose>
</func:result>
</func:function>
这样它也可以工作:
[…]
<func:result>
<xsl:if test="not(contains($string, $delimiter))">
<xsl:value-of select="$string"/>
</xsl:if>
<xsl:if test="not($string='')">
<xsl:value-of select="myext:substring-after-last(substring-after($string, $delimiter), $delimiter)"/>
</xsl:if>
</func:result>
</func:function>
…但是当我尝试使用“三元”函数的实现时,它不起作用;
这不起作用:
<func:result>
<xsl:value-of select="myext:ternary(
contains($string, $delimiter) and not($string = ''),
myext:substring-after-last(substring-after($string, $delimiter), $delimiter),
$string
)"/>
</func:result>
此方法导致我的样式表向我抛出此错误:
Error at xsl:apply-templates on line 49 of file:/[my_main_file].xsl:
Too many nested apply-templates calls
Transformation failed: Run-time errors were reported
我试图通过使用 -Xss16m 开关来增加 Java 的堆栈大小,但这只会导致 Saxon 抛出 OutOfMemoryError(Java 堆空间)。我发送给这个函数的数据集相当小,所以我不明白溢出发生在哪里以及为什么我甚至有必要尝试增加堆栈大小。
我究竟做错了什么?