【发布时间】:2016-07-11 10:54:37
【问题描述】:
给定以下文件:
<doc>
<a>a</a>
<b>1</b>
<b>2</b>
<b>3</b>
<c>c</c>
</doc>
我想把它变成:
<doc>
<a>a</a>
<b>1,2,3</b>
<c>c</c>
</doc>
到目前为止,我所拥有的是(主要取自 SO 的另一篇文章):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="doc">
<xsl:copy>
<xsl:apply-templates select="*[not(self::b)]"/>
<b><xsl:apply-templates select="b/text()"/></b>
</xsl:copy>
</xsl:template>
<xsl:template match="b/text()">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
这会产生以下结果:
<doc><a>a</a><c>c</c><b>1,2,3</b></doc>
但我正在努力寻找一种能够保持文档顺序完整的解决方案。 <b> 元素的任何运行都应替换为包含原始元素文本的单个元素,作为逗号分隔的列表。其他元素不应重新排序。
【问题讨论】:
-
"任何 元素的运行" 会不会不止一个?
-
不,只有一次这样的运行。