如何用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
相关产品推荐
相关产品推荐

