2013-07-04 37 views
0

我想正是複製一些節點,因爲他們使用的是如下因素的模板:XSLT複製節點不起作用

<xsl:template match="example1 | ext-link | example2"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

所以以下輸入:

<ext-link ext-link-type="uri" xlink:href="http://www.gnuplot.info/">http://www.gnuplot.info/</ext-link> 

我會得到exatly TE相同:

<ext-link ext-link-type="uri" xlink:href="http://www.gnuplot.info/">http://www.gnuplot.info/</ext-link> 

然而結果是這樣的:

<ext-link>urihttp://www.gnuplot.info/http://www.gnuplot.info/</ext-link> 

我在使用Java,Saxon。

請幫助我,我做錯了什麼?

回答

2

看一看爲XSLT恆等變換(例如http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT) 添加@*到您的模板匹配。
嘗試:

<xsl:template match="@* | example1 | ext-link | example2"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
+0

這隻會複製匹配表達式中後續元素的屬性嗎? –

+0

這取決於你的樣式表的其餘部分。爲避免任何其他節點輸出,您可以添加'' –

+0

謝謝您的回答。我已經發布了一個替代解決方案讓我知道你想的。我對所有屬性進行了一些修改,但對於這個特殊的問題,它似乎很有用。 –

1

我已經找到一個替代的解決方案,我想知道你怎麼想。它很適合我的目的。

<xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates /> 
</xsl:copy> 
+0

是的,也應該這樣做。 –

+0

這是我使用的版本,如果我不想對屬性進行任何更改。 –

1

如果你真的只是想複製的元素和內容,正是因爲他們是多了一個選擇是隻使用

<xsl:template match="example1 | ext-link | example2"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

雖然使用應用模板hr_117的推式答案通常是首選的,因爲它更容易擴展。