這是一個更簡單的更有效的XSLT 1.0溶液,比計數所有前面的兄弟姐妹:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kFollowing" match="item"
use="generate-id(preceding-sibling::header[1])"/>
<xsl:template match="/*">
<root>
<xsl:apply-templates select="header"/>
</root>
</xsl:template>
<xsl:template match="header">
<heather2>
<xsl:copy-of select="key('kFollowing', generate-id())"/>
</heather2>
</xsl:template>
</xsl:stylesheet>
當施加於以下這種轉變XML文檔:
<root>
<header/>
<item>1</item>
<item>2</item>
<item>3</item>
<header/>
<item>5</item>
<item>6</item>
<item>7</item>
</root>
有用,正確的結果產生:
<root>
<heather2>
<item>1</item>
<item>2</item>
<item>3</item>
</heather2>
<heather2>
<item>5</item>
<item>6</item>
<item>7</item>
</heather2>
</root>
說明:
的關鍵在於以這樣的方式,對於一個header
任何緊以下item
元件是由匹配的定義的header
的generate-id()
。
二, XSLT 2.0溶液:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<root>
<xsl:for-each-group select="item"
group-adjacent=
"generate-id(preceding-sibling::header[1])">
<header2>
<xsl:sequence select="current-group()"/>
</header2>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>
當該變換是在相同的XML文檔(上文)中,相同的正確的結果產生施加:
<root>
<header2>
<item>1</item>
<item>2</item>
<item>3</item>
</header2>
<header2>
<item>5</item>
<item>6</item>
<item>7</item>
</header2>
</root>
說明:使用的xsl:for-each-group
, group-adjacent
,current-group()
好問題,+1。比目前接受的解決方案更簡單和更有效的解決方案是可能的。 –
還添加了XSLT 2.0解決方案。 –
爲兩種解決方案中的每一種添加了解釋。 –