XSLT循环优化:过滤0分数据并补全有效学生记录
实现方案:筛选非0分学生并展示前2条有效记录
核心思路
不要先取前2条再过滤,而是先筛选所有成绩≠0的学生记录,再从中取前2条展示。这种方式自动解决了"前2条包含0分时补充后续有效记录"的问题,因为过滤后的列表里已经没有0分数据,直接取前2条就能保证有效性。
代码实现
1. 示例XML数据(students.xml)
<?xml version="1.0" encoding="UTF-8"?> <students> <student> <name>张三</name> <score>0</score> </student> <student> <name>李四</name> <score>85</score> </student> <student> <name>王五</name> <score>90</score> </student> <student> <name>赵六</name> <score>75</score> </student> </students>
2. XSLT处理逻辑(student_scores.xsl)
直接在xsl:for-each的select属性中完成过滤+取前2条的操作,无需额外判断:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>有效学生成绩(前2条)</h2> <table border="1"> <tr> <th>姓名</th> <th>成绩</th> </tr> <!-- 筛选成绩≠0的学生,同时只取前2条 --> <xsl:for-each select="students/student[score != 0][position() <= 2]"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="score"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
如果成绩字段可能是字符串类型,可将条件改为number(score) != 0,确保数值比较的准确性。
3. PHP调用代码
使用PHP的DOMDocument和XSLTProcessor完成XML与XSLT的结合:
<?php // 加载XML和XSLT文件 $xmlDoc = new DOMDocument(); $xmlDoc->load('students.xml'); $xslDoc = new DOMDocument(); $xslDoc->load('student_scores.xsl'); // 初始化XSLT处理器并执行转换 $processor = new XSLTProcessor(); $processor->importStylesheet($xslDoc); echo $processor->transformToXML($xmlDoc); ?>
边界情况说明
- 如果符合条件的非0分学生不足2条,会自动显示所有有效记录(比如只有1条就显示1条);
- 如果所有学生成绩都是0,可在
xsl:for-each后添加提示文本,比如:<xsl:if test="count(students/student[score != 0]) = 0"> <tr><td colspan="2">无有效成绩记录</td></tr> </xsl:if>
内容的提问来源于stack exchange,提问作者C123D
相关产品推荐
相关产品推荐

