使用XSLT为每个<bill>元素生成独立表格遇阻求助
解决每个
<bill>元素生成独立表格的问题 我帮你排查了下XSLT代码里的问题,主要有两处导致了不符合预期的结果,咱们一步步来修正:
问题分析
- 分组逻辑的拼写错误:你在Muenchian分组的判断条件里把
generate-id()写成了generate id(少了连字符),这会导致分组判断失效,最终只选中了第一个<bill>元素。 - 内层遍历对象错误:你内层的
<xsl:for-each>遍历的是分组后的<bill>元素,但每个<bill>下有多个<product>,直接取product/name只会拿到当前<bill>里的第一个产品,自然每个表格只显示一行。
修正后的完整XSLT代码
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="tableByBillDate" match="bill" use="date" /> <xsl:template match="/"> <html> <head> <title>HTML Document</title> </head> <style> table { font-family: arial, sans-serif; border-collapse: collapse; width: 100%; } td, th { border: 1px solid #dddddd; text-align: left; padding: 8px; } tr:nth-child(even) { background-color: #dddddd; } caption { display: table-caption; text-align: center; } </style> <body> <!-- 调整欢迎语,显示所有学生名字 --> <h3>Welcome <xsl:for-each select="group/student"><xsl:value-of select="name"/><xsl:if test="position() != last()">, </xsl:if></xsl:for-each></h3> <h3>Group: <xsl:value-of select="group/name"/> </h3> <h3>Bills</h3> <!-- 修复generate-id的拼写错误,确保正确分组 --> <xsl:for-each select="group/student/bill[generate-id() = generate-id(key('tableByBillDate', date)[1])]"> <!-- 按日期降序排序账单 --> <xsl:sort select="date" order="descending"/> <table> <caption style="font-weight: bold;">Date: <xsl:value-of select="date"/></caption> <tr> <th>Name</th> <th>Amount</th> <th>Cost</th> <th>Total</th> <th>Participants</th> </tr> <!-- 遍历当前bill下的所有product元素 --> <xsl:for-each select="product"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="amount"/></td> <td><xsl:value-of select="prize"/></td> <td>Calculated with Javascript</td> <td><xsl:value-of select="participant/id"/></td> </tr> </xsl:for-each> </table> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
关键修正点说明
- 修复了
generate id为正确的generate-id(),确保Muenchian分组逻辑正常工作,这样每个不同日期的<bill>都会生成独立的表格。 - 内层循环从遍历
<bill>改为遍历当前<bill>下的所有<product>,这样每个产品都会生成一行表格数据。 - 额外调整了欢迎语部分,显示所有学生的名字(而不是只显示第一个),你可以根据需求保留或修改这部分。
- 将账单的排序移到外层循环,确保表格按日期降序排列。
这样运行后,就会为每个<bill>生成一个独立的表格,每个表格里显示对应账单下的所有产品信息啦~
内容的提问来源于stack exchange,提问作者Zast
相关产品推荐
相关产品推荐

