如何基于子节点值用XSLT生成多个独立订单表格?
按订单生成独立表格并按ID降序的XSLT实现
原代码的问题在于直接遍历所有item节点并尝试按日期分组,导致所有商品被合并到单个表格中。要实现每个订单一个独立表格、按订单ID(oid)降序排列的需求,需要调整遍历对象为order节点,为每个订单单独生成表格,并在表格内展示订单信息和对应商品。
正确的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <html> <head> <style> table { border-collapse: collapse; width: 80%; margin: 20px 0; font-family: Arial, sans-serif; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .order-header { background-color: #e6f2ff; font-weight: bold; } </style> </head> <body> <!-- 遍历所有order节点,按oid数值降序排列 --> <xsl:for-each select="//order"> <xsl:sort select="@oid" data-type="number" order="descending"/> <!-- 为每个订单生成独立表格 --> <table> <!-- 订单信息行,合并三列 --> <tr class="order-header"> <td colspan="3"> 订单ID: <xsl:value-of select="@oid"/> | 订单日期: <xsl:value-of select="date"/> </td> </tr> <!-- 表头行 --> <tr> <th>商品编号</th> <th>商品描述</th> <th>数量</th> </tr> <!-- 遍历当前订单下的所有商品 --> <xsl:for-each select="item"> <tr> <td><xsl:value-of select="@iid"/></td> <td><xsl:value-of select="description"/></td> <td><xsl:value-of select="qty"/></td> </tr> </xsl:for-each> </table> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
关键调整说明
- 遍历对象变更:将遍历对象从
//order/item改为//order,确保每个订单对应一个独立表格。 - 排序逻辑修正:直接对
order节点的@oid属性按数值类型降序排序,保证订单从大到小排列。 - 订单信息展示:添加合并列的表头行,显示当前订单的ID和日期,增强表格可读性。
- 商品行生成:在每个订单表格内部,遍历当前订单下的
item节点,生成对应商品数据行。
内容的提问来源于stack exchange,提问作者Beans
相关产品推荐
相关产品推荐

