Вызов шаблонов xslt для элементов, созданных внутри xslt
Итак, я использую шаблон дизайна идентификаторов для XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(@visible='false')]"/>
</xsl:copy>
</xsl:template>
И у меня есть много шаблонов, соответствующих различным узлам. Теперь я хочу сгенерировать некоторый код внутри одного xsl:template и позволить другому xsl:template соответствовать вновь сгенерированному коду. Кто-нибудь, кто знает, как это сделать?
Пример того, что я хочу сделать:
<xsl:template match="button">
<a href="@url" class="button"> <xsl:value-of select="@name" /> </a>
</xsl:template>
<xsl:template match="stuff">
<!-- do some stuff -->
<!-- get this following line parsed by the template over! -->
<button url="something" name="a button" />
</xsl:template>
2 ответа
Вы не можете делать то, что хотите, так, как пытаетесь, однако, если вы хотите повторно использовать код и избегать дублирования шаблонов, вполне приемлемо, чтобы соответствующий шаблон назывался как именованный шаблон с параметры тоже.
<xsl:template match="button" name="button">
<xsl:param name="url" select="@url" />
<xsl:param name="name" select="@name" />
<a href="{$url}" class="button"> <xsl:value-of select="$name" /> </a>
</xsl:template>
Таким образом, здесь, если он соответствует элементу кнопки, он будет использовать атрибуты url и name в качестве значений по умолчанию, но если вы вызываете его как named-template, вы можете передать свои собственные параметры
<xsl:template match="stuff">
<!-- do some stuff -->
<!-- get this following line parsed by the template over! -->
<xsl:call-template name="button">
<xsl:with-param name="url" select="'something'" />
<xsl:with-param name="name" select="'A button'" />
</xsl:call-template>
</xsl:template>
Вы должны быть в состоянии сделать несколько проходов, используя node-set()
функция расширения.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="first_pass">
<xsl:apply-templates select="button" />
</xsl:variable>
<xsl:apply-templates mode="second_pass" select="ext:node-set($first_pass)/*" />
</xsl:template>
<xsl:template match="button">
<a href="@url" class="button"> <xsl:value-of select="@name" /> </a>
</xsl:template>
<xsl:template match="stuff" mode="second_pass">
<!-- do some stuff -->
<!-- get this following line parsed by the template over! -->
<button url="something" name="a button" />
</xsl:template>
</xsl:stylesheet>
Вы можете получить более подробную информацию в первом ответе XSLT - применить шаблон к результату шаблона вызова.