xslt - 将条目合并到页码

标签 xslt xslt-2.0

我有如下索引条目:

<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/

相关文章:

javascript - 未捕获的类型错误 : Failed to execute 'importStylesheet' on 'XSLTProcessor' : parameter 1 is not of type 'Node'

xml - 语法错误: X cannot be a child of the 'xsl:element' element

xslt - 如何在xsl中引用变量:text element?

xml - XSLT:我可以创建一个本身就是模板的函数库吗?

xml - 如何在xsl:matching-substring中使用last()?

xml - 如何在外部文件中将转义字符声明为 DTD 实体并在 XML 文件中导入

xml - 如何从父文档访问属性以在子文档中使用

xml - 从单个节点中的属性构建 XML 结构

xml - 默认命名空间未正确转换

xslt - 在XSLT中按范围限制输出