【发布时间】:2022-07-07 00:12:54
【问题描述】:
我是 XSLT 的新手,我被困在“分组相邻元素”的问题上。 我的 XML 输入遵循架构:
<body>
<aside class="1">
some tags + text
</aside>
<aside class="2">
some tags + text
</aside>
<aside class="2">
some tags + text
</aside>
<p>...</p>
<img .../>
<aside class="2">
some tags + text
</aside>
<aside class="2">
some tags + text
</aside>
</body>
我需要(但无法实现)的是一个输出,其中 adjacent aside 具有相同的类被组合在一起。期望的输出是这样的:
<body>
<tag1 class="1">everything contained in the grouped tags</tag1>
<tag2 class="2">everything contained in the grouped tags</tag2>
<p>...</p>
<img.../>
<tag2 class="2">everything contained in the grouped tags</tag2>
</body>
可以使用变量来管理新标签,这很好。但是我如何获得这个输出呢?到目前为止,我已经获得了最好的结果:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<xsl:for-each-group select="aside" group-adjacent="@class">
<xsl:variable name="grouping_tag">
<xsl:choose>
<xsl:when test="@class = '1'">tag1</xsl:when>
<xsl:when test="@class = '2'">tag2</xsl:when>
<xsl:otherwise>tagX</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$grouping_tag}" >
<xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
<xsl:for-each select="current-group()/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each>
</xsl:element>
</xsl:for-each-group>
</xsl:template>
此解决方案确实将相邻的 aside 与同一类分组,但在输出中我丢失了其中不包含的所有内容(例如,p、img)。而且我需要维护其他所有内容,并且处于相同的位置。
有人可以帮我吗?
【问题讨论】:
-
请发布一个格式正确的 XML 输入示例和 exact 预期结果。