XSLT: применить шаблон к фрагменту дерева
Я определил переменную $NodeVariable, например:
<xsl:variable name="NodeVariable">
<aT>
<aT2>foo</aT2>
<aT3>bar</aT3>
</aT>
</xsl:variable>
и в разных частях кода я хочу "применить" различные шаблоны к myVariable. К сожалению, я не знаю, каков синтаксис для этого.
Я пробовал следующее:
<xsl:for-each select="$NodeVariable">
<xsl:call-template name="ns:ExtractInfo1"/>
</xsl:for-each>
<xsl:copy-of select="$NodeVariable">
<xsl:call-template name="ns:ExtractInfo2"/>
</xsl:for-each>
<xsl:copy-of select="$NodeVariable">
<xsl:call-template name="ns:ExtractInfo3"/>
</xsl:for-each>
который не работает.
Как применить шаблон к фрагменту дерева?
1 ответ
Предполагая, что вы используете процессор XSLT 1.0, вам нужно сначала преобразовать фрагмент дерева результатов в набор узлов:
<xsl:variable name="NodeVariable">
<aT>
<aT2>foo</aT2>
<aT3>bar</aT3>
</aT>
</xsl:variable>
<xsl:variable name="NodeSet" select="exsl:node-set($NodeVariable)"/>
(где таблица стилей объявляет xmlns:exsl="http://exslt.org/common"
), тогда вы можете применять шаблоны в различных режимах по мере необходимости, например
<xsl:apply-templates select="$NodeSet/aT" mode="m1"/>
и написать шаблоны для этого режима, например
<xsl:template match="aT" mode="m1">
<xsl:value-of select="aT2"/>
</xsl:template>
Конечно, если вы действительно хотите вызывать именованные шаблоны, вы также можете сделать это, но на мой взгляд предпочтительным способом в XSLT является использование apply-templates и режимов для разных этапов обработки.