UPDATE(擾流板):這個問題的答案(見下文大衛·卡萊爾的answere),它看起來像在XSLT實現中的錯誤包括在一些版本的JRE(就像它在JDK但不要在JRE工作1.6.0_20- b02,根本不工作在1.6.0_31-b05)。我在Oracle網站上記錄了一個錯誤。如何將所有子節點原樣複製到結果樹?
我幾乎在那裏,現在它的功能方面。但我對它的某些部分不滿意,其中一些(我相信)可能會更短。這是問題...詳細請參考
這是輸入XML的例子
<?xml version="1.0" encoding="UTF-8"?>
<t1>
<t2 a1="v1">
<ot1 a2="v2" />
<ot2 a3="v3">
<t3 a5="v4">
<ot1 a2="v5" />
</t3>
</ot2>
</t2>
</t1>
這是預期的結果XML的例子(見下面的XSLT文件,以獲取有關線索什麼,什麼)
<?xml version="1.0" encoding="UTF-8"?>
<t1>
<t2 a1="v1">
<gt2 a="ot2" b="gtv1">
<gt1 a="ot1">v2</gt1>
</gt2>
<gt2 a="ot2" b="v3">
<t3 a5="v4">
<gt2 a="ot2" b="gtv1">
<gt1 a="ot1">v5</gt1>
</gt2>
</t3>
</gt2>
</t2>
</t1>
這是XSLT我最後用(但不要太高興)結束。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://exslt.org/common" version="1.0"
exclude-result-prefixes="exslt">
<xsl:output method="xml" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ot1|ot2">
<xsl:variable name="thisResult">
<xsl:apply-templates select="." mode="impl" />
</xsl:variable>
<xsl:apply-templates select="exslt:node-set($thisResult)" />
</xsl:template>
<xsl:template match="ot1" mode="impl">
<ot2 a3="gtv1">
<gt1 a="ot1">
<xsl:value-of select="@a2" />
</gt1>
</ot2>
</xsl:template>
<xsl:template match="ot2" mode="impl">
<gt2 a="ot2" b="{@a3}">
<xsl:for-each select="child::*">
<xsl:element name="{name()}">
<xsl:copy-of select="@*|node()" />
</xsl:element>
</xsl:for-each>
</gt2>
</xsl:template>
</xsl:stylesheet>
問題是:如何讓這個短?
<xsl:for-each select="child::*">
<xsl:element name="{name()}">
<xsl:copy-of select="@*|node()" />
</xsl:element>
</xsl:for-each>
我嘗試下面的事情,但在生成的XML的這種情況下,部分將會丟失
<xsl:copy-of select="node()"/>
還試圖
<xsl:copy-of select="*"/>
(特別爲GT2元件將會丟失屬性)
沒有成功
是的,這是一個錯字,只是修正它(它應該是GT2),並澄清了例子,所以多遍處理將有意義。此外,我嘗試了你的建議,但這對我不起作用。您使用的是哪種XSLT處理器? – 2012-03-25 19:12:28
我使用saxon 6.5進行xslt1測試(否則我會用saxon 9)如果我運行你的樣式表我得到與你相同的結果吧條空格,如果我通過拷貝select =「*」替換for-each獲取與原始樣式表相同的(使用差異確認)輸出。 – 2012-03-25 19:36:14
我正在使用標準JRE內置XSL轉換引擎。看起來我打了一個錯誤。 – 2012-03-25 22:15:56