這是另一種方法來做到這一點。
首先,匹配塊元件
<xsl:template match="block/child::*">
接下來,檢查如果該元素的最直接的兄弟具有不同的名稱的所有子節點上,表示這是第一個或多個相鄰元素:
<xsl:if test="local-name(preceding-sibling::*[position()=1]) != $name">
如果是這樣,您可以複製該節點。然後,您需要複製具有相同名稱的以下兄弟姐妹。我通過遞歸調用每個緊隨同胞的模板名稱相同
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
把所有這些組合起來做這給
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- Match children of the block element -->
<xsl:template match="block/child::*">
<xsl:variable name="name" select="local-name()"/>
<!-- Is this the first element in a sequence? -->
<xsl:if test="local-name(preceding-sibling::*[position()=1]) != $name">
<xsl:copy>
<xsl:apply-templates />
<!-- Match the next sibling if it has the same name -->
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<!-- Recursive template used to match the next sibling if it has the same name -->
<xsl:template match="block/child::*" mode="next">
<xsl:variable name="name" select="local-name()"/>
<xsl:apply-templates />
<xsl:apply-templates select="following-sibling::*[1][local-name()=$name]" mode="next"/>
</xsl:template>
<!-- Template used to copy a generic node -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
對於我的問題的解決方案,我只需要合併「AAA」的節點,因此,我必須通過將'match ='int:block/child :: *'''更改爲'match ='int:block/child :: aaa''來稍微調整您的解決方案,否則它可以完美地工作。 – Peter 2009-11-27 20:59:34