Мне нужно запустить все шаблоны в зависимости от режима, поэтому у меня есть firstmode
, который необходимо для запуска соответствующего шаблона на основе mode
Входные данные:
<section>
<p class="p heading">Heading</p>
<p class="normal">Text</p>
</section>
Рабочий XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:template match="*">
<xsl:variable name="firstmode">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="firstmode"/>
</xsl:element>
</xsl:variable>
<xsl:sequence select="$firstmode"/>
</xsl:template>
<xsl:template match="*" mode="firstmode">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="firstmode"/>
</xsl:copy>
</xsl:template>
<xsl:param name="class-map">
<name>
<old>heading</old>
<new>Headings</new>
</name>
<name>
<old>normal</old>
<new>Actual</new>
</name>
</xsl:param>
<xsl:key name="class-map" match="name/new" use="../old"/>
<xsl:template match="p/@class[key('class-map', tokenize(.), $class-map)]" mode="firstmode">
<xsl:attribute name="style">
<xsl:attribute name="{name()}" select="key('class-map', tokenize(.) , $class-map)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="p" mode="firstmode">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<normal>
<xsl:apply-templates/>
</normal>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ожидаемый результат:
<p style="Headings"><normal>Heading</normal></p>
<p style="Actual"><normal>Text</normal></p>
После включения mode="firstmode"
в шаблоны ожидаемые результаты не получаются. Пожалуйста, подскажите, как с этим справиться.