XSLT: применить шаблон к фрагменту дерева

#xslt #node-set

#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. Вы сами пометили свой вопрос [node-set] . Вот ваш ответ. Используйте node-set() функцию расширения. То, как функция может быть доступна, зависит от вашего процессора XSLT.

Ответ №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" ), затем вы можете применять-templates в разных режимах по мере необходимости, например

 <xsl:apply-templates select="$NodeSet/aT" mode="m1"/>
  

и напишите шаблоны для этого режима, например

 <xsl:template match="aT" mode="m1">
  <xsl:value-of select="aT2"/>
</xsl:template>
  

Конечно, если вы действительно хотите вызывать именованные шаблоны, вы могли бы сделать и это, но, на мой взгляд, использование apply-templates и modes для разных этапов обработки является предпочтительным способом в XSLT.

Комментарии:

1. Что, если я использую процессор XSLT 2.0?

2. @jimifiki, с процессором XSLT 2.0 различие между входными деревьями и фрагментами результирующего дерева исчезает, ваша переменная будет просто временным деревом, которое вы можете обрабатывать так же, как входное дерево, и использовать, например <xsl:apply-templates select="$NodeVariable/aT" mode="m1"/> .