2013-04-10 6 views
0

Это код у меня есть:Применить-шаблоны

<xsl:template match="*"> 
    <Segment ID="{name()}"> 
    <xsl:value-of select="concat(., ' ')"/> 
    </Segment>  
</xsl:template> 

<xsl:template match="*" mode="break"> 
    <Segment ID="{name()}"> 
    <xsl:value-of select="."/> 
    </Segment> 
    <Segment>#$NL</Segment> 
</xsl:template> 

Есть ли способ, чтобы вызвать первый шаблон внутри второго шаблона, так что я не должен повторять код? Что-то вроде этого:

<xsl:template match="*" mode="break"> 
    <xsl:apply-templates select="*"/> 
    <Segment>#$NL</Segment> 
</xsl:template> 

Я использую * здесь и не работает. Я пробовал @ * и /, но ничего не работает. Цель для меня назвать это так:

<xsl:apply-templates select="FirstName"/> 

или

<xsl:apply-templates select="Name" mode="break"/> 

ответ

1

Если вы используете xsl:call-template, а не xsl:apply-templates, вы можете создать именованный шаблон, а затем вызвать его всякий раз, когда вам это нужно.

Если я правильно понял ваш вопрос, повторяющийся код является элементом сегмента с указанным атрибутом ID и внутренней текстовой строкой. Таким образом, вы можете дать этому шаблону эти два параметра и указать их при его вызове. Как это:

<xsl:template name="segment"> 
    <xsl:param name="id"/> 
    <xsl:param name="text"/> 
    <Segment ID="{$id}"> 
     <xsl:value-of select="$text"/> 
    </Segment>  
</xsl:template> 

... 
    <xsl:call-template name="segment"> 
     <xsl:with-param name="id" select="name(.)"/> 
     <xsl:with-param name="text" select="."/> 
    </xsl:call-template> 
1

Вы можете просто заменить два шаблон вы показали нам с этими двумя:

<xsl:template match="*" name="Segment"> 
    <Segment ID="{name()}"> 
    <xsl:value-of select="concat(., ' ')"/> 
    </Segment>  
</xsl:template> 

<xsl:template match="*" mode="break"> 
    <xsl:call-template name="Segment" /> 
    <Segment>#$NL</Segment> 
</xsl:template> 

Я могу видеть, что в исходном XSLT, первый шаблон был конкатенация пространства на значение , а второй - нет. При таком подходе пространство будет добавлено в обоих случаях. Это удовлетворительно для ваших требований?

+1

Ничего себе, это работает. Благодарю. Я думал, что если я использую атрибут name, я должен использовать параметр. Думаю, мне нужно больше узнать о теге call-template. – Johnny

+0

Шаблон, вызываемый с помощью 'call-template', будет выполняться в контексте текущего узла, поэтому это удобный способ иметь несколько общих шаблонов для общих функций. – JLRishe

+0

Вы также можете использовать режимы и выполнять ' 'для достижения такого же эффекта. –