在XSLT 1.0中,将当前上下文节点传递给被调用模板并使该节点成为被调用模板中的上下文节点的最短/最干净/推荐方法是什么?
如果没有xsl:param并且由空调用模板调用的模板只是选择调用者的上下文节点,那将是很好的(它会,对吗?)但是我能想到的最好的是:< / p>
<xsl:call-template name="sub">
<xsl:with-param name="context" select="." />
</xsl:call-template>
带
<xsl:template name="sub">
<xsl:param name="context" />
<xsl:for-each select="$context">
</xsl:for-each>
</xsl:template>
答案 0 :(得分:26)
如果没有
xsl:param
的模板,那会很好(对吗?) 并且由空call-template
调用只会拿起。{ 调用者的上下文节点。
这正是W3C XSLT 1.0(和2.0)规范中xsl:call-template
的定义,并由任何兼容的XSLT处理器实现。
这是一个小例子:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="a">
<xsl:call-template name="currentName"/>
</xsl:template>
<xsl:template name="currentName">
Name: <xsl:value-of select="name(.)"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档:
<t>
<a/>
</t>
产生了想要的正确结果:
Name: a
答案 1 :(得分:4)
除了解释Dimitre所说的话之外。
从节点调用模板时,您已经在该节点中,
示例:
假设此代码:
<xsl:template match="MyElement">
<xsl:call-template name="XYZ"/>
</xsl:template>
<xsl:template name="XYZ>
<xsl:value-of select="."/>
</xsl>
上面的代码和写作一样好:
<xsl:template match="MyElement">
<xsl:value-of select="."/>
</xsl:template>
您也可以在被调用模板中使用for-each循环。 :)
但请确定你到底在哪里..