XSLT技术问询:如何按页面统计text元素的位置序号
XSLT计算text元素的页码及页面内序号解决方案
问题背景
给定嵌套结构的XML文档,需要编写XSLT模板匹配所有<text>元素,计算两个值:
- 该元素所在的页码(如
page2 text8对应页码2) - 该元素在所属页面内的全局序号(如
page2 text8对应页面内序号8)
原模板中position-in-page的计算逻辑错误,因为preceding::*会统计整个文档中当前节点之前的所有同类型元素,包含其他页面的节点,导致序号不准确。
正确实现模板
<xsl:template match="text"> <!-- 计算当前text所在的页码 --> <xsl:variable name="page-number" select="count(ancestor::page/preceding-sibling::page) + 1"/> <!-- 计算当前text在所属页面内的全局序号 --> <xsl:variable name="position-in-page" select="count(ancestor::page//text[. << current()]) + 1"/> <!-- 可根据需求自定义输出格式,以下为示例 --> <text-item> <content><xsl:value-of select="."/></content> <page-num><xsl:value-of select="$page-number"/></page-num> <page-position><xsl:value-of select="$position-in-page"/></page-position> </text-item> </xsl:template>
代码说明
页码计算:
通过ancestor::page定位到当前text所属的页面节点,统计该页面节点之前的同级<page>元素数量,加1得到页码,比原方法count(preceding::page)+1更精准(避免跨层级干扰)。页面内序号计算:
ancestor::page//text限定范围为当前页面下所有<text>元素. << current()筛选出这些text中在当前节点之前出现的节点(按文档顺序)- 统计符合条件的节点数量后加1,得到当前text在页面内的全局序号
验证结果
以page2 text8为例:
- 页码:
count(ancestor::page/preceding-sibling::page)+1 = 1 + 1 = 2 - 页面内序号:当前page2下共有8个text节点在它之前,加1后得到8,符合预期。
内容的提问来源于stack exchange,提问作者CrazyEight
相关产品推荐
相关产品推荐

