我有如下索引条目:
<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>
(当然,这里的“pages”属性可能有所不同)
现在到了困难的一步,我应该如何迭代列表?必须有一些聪明的解决方案来检查下一个同级/@page(我可以将页面放入序列中)是否是当前的@page + 1。
最佳答案
这是一个示例:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="entries">
<xsl:for-each-group select="entry" group-by="@name">
<index name="{current-grouping-key()}">
<xsl:attribute name="pages">
<xsl:for-each-group select="current-group()/xs:integer(@page)" group-by="position() - .">
<xsl:if test="position() gt 1">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="if (current-group()[2])
then (current-group()[1], current-group()[last()])
else ."
separator="-"/>
</xsl:for-each-group>
</xsl:attribute>
</index>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
输入为
<entries>
<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" />
</entries>
我得到了结果
<index name="a" pages="1"/>
<index name="b" pages="3-4, 6"/>
<index name="c" pages="7"/>
关于xslt - 将条目合并到页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10349048/