2013-02-06 63 views
1

我有一個這樣的XML:如何在使用xsl生成的節點上使用xsl:apply-templates?

<span reference="1">Reference Text 1</span> 
<term reference="2">Reference Text 2</term> 

,我需要它成爲本:

<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a> 
<i>Reference Text 2</i> <a href="2">[2]</a> 

所以,基本上,如果與reference屬性的元素是一個跨度,我們只是把它原樣,加入class="referenceText"。如果它是其他任何元素,那麼我們也應該爲這個元素創建模板。這就是爲什麼<term>應該成爲<i> - 我有這方面的模板:

<xsl:template match="term"> 
    <i><xsl:apply-templates select="@* |node()"/></i> 
</xsl:template> 

所有元素的一個「參考」標籤的轉型我有這樣的模板:

<xsl:template match="*[@reference]"> 

    <xsl:param name="href" select="./@reference"/> 

    <xsl:choose> 
    <xsl:when test="name() = 'span'"> 
     <span class="referenceText"> 
     <xsl:value-of select="."/> 
     </span> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 

    <xsl:text> </xsl:text><a href="#{$href}">[<xsl:value-of select="./@href"/>]</a> 

</xsl:template> 

不幸的是,這導致在folllowing輸出中:

<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a> 
<term>Reference Text 2</term> <a href="2">[2]</a> 

所以,<term>不轉化爲<i>。看起來我需要某種遞歸來重新將模板應用於已生成的模板,但我無法想出任何東西。

回答

1

如果您使用XSLT 1.0,則可以將輸出捕獲到變量中,然後使用exslt:node-set函數將模板應用於該變量。儘量避免無限遞歸,儘管:)

<xsl:variable name="foo"> 
... 
</xsl:variable> 
<xsl:apply-templates select="exslt:node-set($foo)"/> 
+0

你可能告訴我如何在我的代碼上做到這一點?我剛剛嘗試過,似乎沒有工作。幾乎我所有的結果文件都消失了。 – snitko

+0

您需要將xmlns:exslt =「http://exslt.org/common」添加到您的根元素(或其他地方)以定義exslt命名空間。你在使用哪種XSLT處理器? –

+0

我正在使用'libxslt'。嘗試添加'xmlns:exslt =「exslt.org/common」'到根元素,沒有運氣。 – snitko