2013-04-10 24 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屬性和內部文本字符串的Segment元素。所以你可以給這個模板這兩個參數,並在你調用它時指定它們。就像這樣:

<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

哇,那有效。謝謝。我想如果我使用名稱屬性,我必須使用參數。猜猜我必須瞭解更多關於call-template標籤。 – Johnny 2013-04-10 00:34:27

+0

使用'call-template'調用的模板將在當前節點的上下文中執行,因此這是讓多個模板共享一些常用功能的簡便方法。 – JLRishe 2013-04-10 00:53:53

+0

您當然也可以使用模式,並執行''來達到同樣的效果。 – 2013-04-10 08:33:14