【发布时间】:2022-01-22 19:12:26
【问题描述】:
我的 XSLT 中有一个递归函数。它旨在识别元素的“链”,其中链被定义为具有 start(n+1)=end(n) 的元素序列,例如:
<!-- first chain starts here -->
<event start="T0" end="T1">doo</event>
<event start="T1" end="T2">doo</event>
<event start="T2" end="T3">doo</event>
<!-- first chain ends here -->
<event start="T4" end="T5">doo</event>
<event start="T5" end="T6">doo</event>
我正在使用以下递归函数:
<!-- returns latest event that is connected to the given event through an uninterrupted chain of other events -->
<xsl:function name="exmaralda:last-endpoint-of-segment-chain">
<xsl:param name="event"/>
<xsl:choose>
<xsl:when test="not($event/following-sibling::event) or exmaralda:timeline-position($event/following-sibling::event[1]/@start)>exmaralda:timeline-position($event/@end)">
<xsl:value-of select="$event/@end"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="exmaralda:last-endpoint-of-segment-chain($event/following-sibling::event[1])"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
只要事件序列不太长(它们通常包含不超过 10 个元素),它就可以正常工作。但是,如果它们的长度超过某个值,则转换会引发错误“XSLT 中的嵌套函数调用过多”。我已经读过,为了避免这种情况,递归函数应该是尾递归的。但是,我不明白为什么我的递归不具有该属性。谁能看到这里可能出了什么问题?
我使用 Saxon 9he 作为 XSL 引擎。
【问题讨论】:
-
Saxon 有一些关于如何实现尾递归的文档,请参阅saxonica.com/documentation10/index.html#!xsl-elements/function中的相关部分
标签: xml recursion xslt xslt-2.0 saxon