是否可以使用XSLT 1.0对XML中的entry条目按客户字段分组展示?
解决方案
你要的功能可以通过XSLT 1.0标准的Muenchian分组法实现,无需硬编码客户名称,完全适配你的需求:
完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义分组键:按customer字段分组entry节点 --> <xsl:key name="customerGroup" match="entry" use="customer" /> <xsl:output method="text" encoding="UTF-8" /> <xsl:strip-space elements="*" /> <xsl:template match="/data"> <!-- 遍历所有唯一客户(每个客户只取第一个出现的entry节点) --> <xsl:for-each select="entry[generate-id() = generate-id(key('customerGroup', customer)[1])]"> <!-- 输出客户名称 --> <xsl:value-of select="customer" />: <xsl:text> </xsl:text> <!-- 遍历当前客户的所有订单条目 --> <xsl:for-each select="key('customerGroup', customer)"> <xsl:text> </xsl:text> <xsl:value-of select="sku" /> <xsl:text> </xsl:text> <xsl:value-of select="desc" /> <xsl:text> </xsl:text> </xsl:for-each> <!-- 不同客户之间加空行 --> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
输出效果
和你要求的完全一致:
Acme: 123123 Name Of First Product 789789 Name Of Third Product GeneriCo: 456456 Name Of Second Product
使用说明
- 代码无需修改即可直接适配你现有的XML结构,即使后续新增客户也不需要调整代码
- 之前浏览器打开无输出大概率是示例未设置输出格式为text,或者XML和XSLT的关联配置错误,你可以在XML文件头部加上如下关联语句后直接在浏览器打开:
<?xml-stylesheet type="text/xsl" href="你的xsl文件名.xsl"?>
- 如果是服务端处理,直接用WAMP自带的XSLT1.0处理器调用即可正常输出结果。
内容的提问来源于stack exchange,提问作者rxtre
相关产品推荐
相关产品推荐

