You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XPath谓词与XSLT实现XML节点分页并按列展示

修正XSLT实现按字段行的分页人员表格

示例人员XML结构

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person>
    <fname>John</fname>
    <lname>Doe</lname>
    <age>30</age>
  </person>
  <person>
    <fname>Jane</fname>
    <lname>Smith</lname>
    <age>28</age>
  </person>
  <person>
    <fname>Bob</fname>
    <lname>Brown</lname>
    <age>35</age>
  </person>
  <person>
    <fname>Alice</fname>
    <lname>Wilson</lname>
    <age>25</age>
  </person>
  <person>
    <fname>Charlie</fname>
    <lname>Clark</lname>
    <age>40</age>
  </person>
</people>

修正后的XSLT样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="page-number" select="1"/>
  <xsl:param name="items-per-page" select="3"/>

  <!-- 计算当前页的人员范围 -->
  <xsl:variable name="start-position" select="($page-number - 1) * $items-per-page + 1"/>
  <xsl:variable name="end-position" select="$start-position + $items-per-page - 1"/>
  <xsl:variable name="current-page-people" select="/people/person[position() >= $start-position and position() <= $end-position]"/>

  <!-- 获取所有需要展示的字段名(取第一个person的子元素节点名) -->
  <xsl:variable name="field-names" select="/people/person[1]/*/name()"/>

  <xsl:template match="/">
    <html>
      <body>
        <table border="1">
          <!-- 遍历每个字段,生成一行 -->
          <xsl:for-each select="$field-names">
            <xsl:variable name="current-field" select="."/>
            <tr>
              <!-- 字段名单元格 -->
              <td><xsl:value-of select="$current-field"/></td>
              <!-- 遍历当前页的人员,生成对应字段值的单元格 -->
              <xsl:for-each select="$current-page-people">
                <td><xsl:value-of select="*[name() = $current-field]"/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>

        <!-- 分页导航 -->
        <div>
          <xsl:if test="$start-position > 1">
            <a href="?page-number={$page-number - 1}">上一页</a>
          </xsl:if>
          <span> 第 <xsl:value-of select="$page-number"/> 页 </span>
          <xsl:if test="$end-position < count(/people/person)">
            <a href="?page-number={$page-number + 1}">下一页</a>
          </xsl:if>
        </div>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

关键修正说明

  • 反转行生成逻辑:放弃原有的按人员节点生成行的方式,改为按字段名循环生成行,每行对应当前页所有人员的该字段值。
  • 精准分页筛选:通过start-position和end-position计算当前页的人员节点范围,确保仅处理指定数量的记录。
  • 统一字段列表:提取第一个人员节点的所有子元素名称作为字段列表,保证所有行的字段顺序一致。
  • 动态字段匹配:在字段行循环中,使用*[name() = $current-field]匹配当前人员的对应字段,确保单元格值与字段一一对应。

内容的提问来源于stack exchange,提问作者mirexS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:41:10