2011-12-09 76 views

回答

11

在一个非常基本的水平,你使用<xsl:apply-templates>当你想自动让处理器处理节点,并使用<xsl:call-template/>当你想在加工更精细的控制。所以,如果您有:

<foo> 
    <boo>World</boo> 
    <bar>Hello</bar> 
</foo> 

而且你有以下XSLT:

<xsl:template match="foo"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="bar"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="boo"> 
    <xsl:value-of select="."/> 
</xsl:template> 

你会得到的结果WorldHello。从本质上讲,你已经说过了“处理这种方式吧”,然后让XSLT处理器在处理这些节点时处理这些节点。在大多数情况下,这就是您应该如何在XSLT中做的事情。

虽然有时候,你想做些更有趣的事情。在这种情况下,您可以创建一个不匹配任何特定节点的特殊模板。例如:

<xsl:template name="print-hello-world"> 
    <xsl:value-of select="concat(bar, ' ' , boo)" /> 
</xsl:template> 

然后你可以调用这个模板,而你正在处理<foo>而不是自动处理foo的子节点:

<xsl:template match="foo"> 
    <xsl:call-template name="print-hello-world"/> 
</xsl:template> 

在这个特定的人为例子,你现在得到“ Hello World“,因为你已经覆盖默认的处理来做你自己的事情。

希望有所帮助。

+0

到目前为止,这是我在XSLT读过(虽然我要补充一句,XSLT的最好解释是不是我的事,可能永远不会。将会) –

3

请你解释我 <xsl:apply-template><xsl:call-template>,当我应该使用 <xsl:call-template>之间的区别?

一个可以使用<xsl:call-template>但几乎从未应该

它是XSLT的精神,让XSLT处理器,以确定到底是哪模板最佳匹配一个节点,来决定使用这个模板,用于处理节点。这给了我们干净,简单而强大的可扩展性和多态性。

通常,比较xsl:apply-templatesxsl:call-template与将虚拟方法从基类的调用与直接调用非虚方法的方法进行比较相似。

这里有一些重要的区别

  1. xsl:apply-templates也更加丰富,比xsl:call-templates,甚至从xsl:for-each更深只是因为我们不知道什么代码将的节点上应用 的选择 - 在一般情况下,该代码将与节点列表的不同节点 不同。

  2. 将应用于 可写的方式xsl:apply-templates后由 人不知道原作者的代码。

FXSL library的实现在XSLT高阶函数(HOF)是不可能的,如果 XSLT没有足够的<xsl:apply-templates>指令。

摘要:模板和<xsl:apply-templates>指令是XSLT如何实现和处理多态性。人们可以也应该避免使用xsl:call-template,它不允许多态性,并限制了可重用性和灵活性。

参考:看到这个整个主题:http://www.stylusstudio.com/xsllist/200411/post60540.html

相关问题