@ EMPO的答案只能在非常簡單的情況下,而不是像這樣的XML文檔:
<root>
<c>
<d></d>
<e>
<f></f>
</e>
<b></b>
<b></b>
<b></b>
</c>
<b></b>
<b></b>
</root>
在這裏,如果我們想要一個a
,單程內包裝每組連續b
s到實現這一目標是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFollowing" match="b"
use="generate-id(preceding-sibling::*[not(self::b)][1])"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="b[not(preceding-sibling::*[1][self::b])]">
<a>
<xsl:copy-of select=
"key('kFollowing', generate-id(preceding-sibling::*[1]))"/>
</a>
</xsl:template>
<xsl:template match="b"/>
</xsl:stylesheet>
當這種轉變是在上面的XML文檔應用中,希望正確的結果(連續b
一切都組包裹在a
)產生:
<root>
<c>
<d/>
<e>
<f/>
</e>
<a>
<b/>
<b/>
<b/>
</a>
</c>
<a>
<b/>
<b/>
</a>
</root>
問得好,+1。看到我的答案是比目前接受的解決方案更通用的解決方案。我的解決方案將'a'中的每個*組'b'包裝起來。 –