请您解释一下<xsl:apply-template>
和<xsl:call-template>
之间的区别,以及我应该何时使用<xsl:call-template>
?
谢谢
答案 0 :(得分: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
。从本质上讲,你已经说过“以这种方式处理bar和boo”,然后你就让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”,因为您已经覆盖默认处理以执行自己的操作。
希望有所帮助。
答案 1 :(得分:3)
你能解释一下我之间的区别吗?<xsl:apply-template>
和<xsl:call-template>
我应该何时使用<xsl:call-template>
?
一个可以使用<xsl:call-template>
但永远不会 。
XSLT的精神是允许XSLT处理器确切地确定哪个模板最匹配节点并决定使用此模板来处理该节点。这为我们提供了干净,简单和强大的可扩展性和多态性。
通常,将xsl:apply-templates
与xsl:call-template
进行比较类似于比较从基类调用虚方法到直接调用非虚方法的方法。
以下是一些重要的差异:
xsl:apply-templates
比xsl:call-templates
更丰富更深,甚至来自xsl:for-each
,只是因为我们不知道将应用哪些代码在节点上
选择 - 在一般情况下,此代码将有所不同
节点列表的不同节点。
将应用的代码
写完xsl:apply-templates
之后可以写出来
那些不了解原作者的人。
如果XSLT没有<xsl:apply-templates>
指令,则无法在XSLT中实现FXSL library高阶函数(HOF)。
摘要:模板和<xsl:apply-templates>
指令是XSLT实现和处理多态的方式。人们可以而且应该避免使用xsl:call-template
,它不允许使用polimorphism并限制可重用性和灵活性。
参考:查看整个帖子: http://www.stylusstudio.com/xsllist/200411/post60540.html