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 и режимов для разных этапов обработки.

Другие вопросы по тегам