Это в значительной степени зависит от ряда вещей, которые вы не упомянули, например, всегда ли дочерние элементы расположены в порядке (то есть всегда ли это будет <b><b><c>
или может быть <b><c><b>
), и являются ли элементы всегда дочерними.элемента <A3>
.
Для приведенного выше XML я написал шаблон для обработки элемента следующим образом:
<xsl:template match="A3">
<A3>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="following-sibling::*[name()=current()/name()] and not(preceding-sibling::*[name()=current()/name()])">
<xsl:element name="{name()}">
<xsl:for-each select="self::* | following-sibling::*[name()=current()/name()]">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:when>
<xsl:when test="not(following-sibling::*[name()=current()/name()]) and preceding-sibling::*[name()=current()/name()]">
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</A3>
</xsl:template>
Вероятно, существует более простой способ сделать это, но этоэто один из способов по крайней мере.Это может быть медленно в зависимости от количества дочерних элементов, которые у вас есть для определенного узла.