XSLT Пропустить текущий контекст в шаблоне вызова
В XSLT 1.0, что является самым коротким/самым чистым/рекомендуемым способом передачи текущего контекста node вызываемому шаблону и имеет ли этот node контекст node внутри вызываемого шаблона?
Было бы хорошо (это было бы, правда?), если бы шаблон без xsl: param и вызванный пустым шаблоном вызова просто подхватил контекст вызывающего node, но лучшее, что я могу придумать, это
<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>
Ответы
Ответ 1
Было бы хорошо (это было бы, правда?), если шаблон без xsl:param
и вызывается пустым call-template
, просто подбирает контекст вызывающего абонента node.
Именно так xsl:call-template
определяется в спецификации W3C XSLT 1.0 (и 2.0) и реализуется любым совместимым 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
Ответ 2
Просто иначе объясните, что сказал Димитр.
Когда вы вызываете шаблон из node, вы уже находитесь в этом node,
Пример:
принять этот код:
<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>
Вы также можете использовать для каждого цикла в вызываемом шаблоне.:)
Но просто убедитесь, что вы точно...