#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"/>
.