我有一个索引条目,如下所示:
<entry name="a" page="1" />
<entry name="b" page="3" />
<entry name="b" page="4" />
<entry name="b" page="6" />
<entry name="c" page="7" />
现在我想得到类似的东西
<index name="a" pages="1 />
<index name="b" pages="3-4, 6" />
<index name="c" pages="7" />
有一些现成的功能吗?
我正在考虑一个两遍解决方案,首先将索引条目以如下格式放置
<index name="a" pages="1 />
<index name="b" pages="3 4 6" />
<index name="c" pages="7" />
然后将“3 4 6”变成“3-4, 6”。第一步很简单:
<xsl:for-each-group select="index" group-adjacent="@name">
<xsl:element name="index">
<xsl:attribute name="name" select="@name"/>
<xsl:attribute name="pages" select="current-group()/@page"/>
</xsl:element>
</xsl:for-each-group>
(当然,此处的属性“页面”可能有所不同)
现在到了困难的一步,我应该如何遍历列表?必须有一些聪明的解决方案来检查下一个以下兄弟/@page(我可以将页面放入一个序列中)是否是当前的@page + 1。