XSL递归调用 - xsl:functions vs xsl:带调用模板的模板

Rac*_*hel 9 xslt xslt-2.0 xslt-1.0

我有基本的查询.我一直在使用xsl:template并使用call tempate对模板进行递归调用.我看到xsl:function也有可能使递归函数调用像递归模板调用并实现相同.什么时候应该使用xsl:function以及何时应该使用xsl:template.我不确定两者之间的差异是什么以及何时应该使用它们.他们每个人的特点是什么?有人可以帮助我更好地理解这一点.

Dim*_*hev 6

这就是差不多3年前回答类似问题的方式:

使用的好处<xsl:function/>:

  1. 组合性.

  2. 在一个表达式中看起来很棒,它将它用作参数,返回值或部分应用程序.

  3. 可读性(紧凑性)和可维护性.

  4. 更松散的耦合(不依赖于隐式上下文节点)

  5. 可以在XPath表达式中引用

不足之处:

  1. 参数仅由位置(而不是名称)标识

  2. 可能是不纯的(可能有副作用,例如创建新节点),只是通过查看引用此函数的表达式,人们可能不明白它有副作用.但是,如果使用适当的命名,则可以消除这种混淆的可能性.

我总是喜欢用<xsl:function/>.在函数创建新节点的情况下,我遵循使用字符串"make"启动其local-name的约定,如makePerson().

我只能添加到这个:

始终尽可能使用<xsl:function>.

在XPath 3.0中,函数是该语言的第一类数据类型(也称为HOF - 高阶函数).它们可以作为参数传递或作为结果返回到其他函数或从其他函数返回.

这是使用命名模板的一个非常强大的飞跃.


Nar*_*aen 1

我发现 Dimitre 的回复 - http://www.stylusstudio.com/xsllist/200811/post00400.html - 有帮助。

使用的好处<xsl:function/>

  1. 可组合性。

  2. 在将其用作参数、返回值或部分应用程序的表达式中看起来很棒。

  3. 可读性(紧凑性)和可维护性。

  4. 更松散的耦合(不依赖于隐式上下文节点)

  5. 可以在 XPath 表达式中引用

缺点:

  1. 参数仅通过位置(不通过名称)标识

  2. 可能是不纯的(可能有副作用,例如创建新节点),并且仅通过查看引用此函数的表达式,人们可能不明白它有副作用。然而,如果使用正确的命名,则可以消除这种混淆的可能性。

我倾向于总是使用<xsl:function/>. 在函数创建新节点的情况下,我遵循以字符串“make”开头其本地名称的约定,如 中所示makePerson()