XSL递归调用- XSL:函数vs XSL:模板与调用模板



我有基本的查询。我一直在使用xsl:template,并使用call template对模板进行递归调用。我看到xsl:function也可以像递归模板调用一样进行递归函数调用并达到相同的效果。什么时候应该使用xsl:function,什么时候应该使用xsl:template。我不确定这两者之间有什么区别,什么时候应该使用它们。它们各自的特点是什么?

这是我是如何回答一个类似的问题差不多3年前:

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

  1. 可组合性。

  2. 在使用它作为参数的表达式中看起来很棒,如返回值或作为部分应用程序。

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

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

  5. 可以在XPath表达式

  6. 中引用。

缺点:

  1. 参数只能通过位置标识,不能通过名称标识

  2. 可能是不纯的(可能有副作用,例如创建新节点)只要看一个表达式引用这个函数的人可能不明白它有它的一面的效果。然而这种可能性如果适当,可以消除混乱

我总是倾向于使用<xsl:function/>。在函数创建时的约定从local-name开始字符串"make",如makePerson() .

我只能补充:

尽可能使用<xsl:function>

在XPath 3.0中,函数是该语言的一等数据类型(又名HOF——高阶函数)。它们可以作为形参传递,也可以作为结果从其他函数返回。

这是一个令人难以置信的强大飞跃从使用命名模板

从概念上讲,xsl:apply-templates是一个映射,其多态函数表示您已声明的所有规则。xsl:function声明了一个"常规"函数,可以在任何其他接受XPath表达式的指令或声明中使用。xsl:call-template指令"调用"一个特定的命名模板(在某种程度上,你可以把它想象成一个函数)。

正因为如此,每一个评估上下文的涉及方式是不同的:xsl:apply-templates定义了一个新的上下文列表,从中获取上下文节点以及邻近位置;xsl:function没有上下文节点定义(这是一个错误,依赖它);xsl:call-template不改变求值上下文

另一个明显的区别是它们与输出的关系:xsl:apply-templatesxsl:call-template作为XSLT指令输出它们构造的序列;xsl:function作为XPath表达式的一部分,它没有。

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

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

  1. 可组合性。

  2. 在使用它作为参数的表达式中看起来很棒,如返回值或作为部分应用程序。

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

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

  5. 可以在XPath表达式

  6. 中引用。

缺点:

  1. 参数只能通过位置标识,不能通过名称标识

  2. 可能是不纯的(可能有副作用,例如创建新节点)只要看一个表达式引用这个函数的人可能不明白它有它的一面的效果。然而这种可能性如果适当,可以消除混乱

我总是使用<xsl:function/>。在函数创建时的约定从local-name开始字符串"make",如makePerson() .

Templates are useful when you have the requirement to store the results of each recursion into a variable as a attribute ( at the end of each recursion before calling the next ).
**Example:**
    <xsl:variable name="test">
     <record>
        <xsl:call-template name="templateRecursion">
              <xsl:with-param name="xyz" select="xyz"/>   
        </xsl:call-template>
     <record>
    </xsl:variable>
**templateRecursion:**
    <xsl:template name="templateRecursion">
    <!-- Do processing -->
     <xsl:attribute name="" value=""
    </xsl:template>
So, the variable test will have 
    <record>
     <attribute_name="" value=""/>
      .
      .
    </record>

相关内容

  • 没有找到相关文章

最新更新