2012-05-08 1 views
0

Так я использую шаблон проектирования идентичности для 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> 
+0

Потому что я хочу добавить кнопку, но пусть кнопка, создающая часть скрипта, создаст фактическую разметку кнопки. – Knarf

ответ

3

Вы не можете сделать совсем то, что вы хотите сделать так, как вы пытаетесь, однако, если намерение состоит в том, чтобы повторно использовать код и избегать дублирования шаблонов, вполне приемлемо, чтобы соответствующий шаблон был вызван как именованный шаблон с параметрами.

<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 и имени атрибутов, как значения по умолчанию, но если вы называете его в качестве именованного шаблона, вы можете передать в своих собственных параметров

<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> 
1

Вы должны быть в состоянии сделать некоторую обработку многоходовую с помощью функции 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 - apply a template to call-template result.