如何使用XSLT对XML文档分组输出并仅显示唯一标题?
按Subsystem分组并显示唯一标题的XSLT解决方案
针对你提供的XML结构,我们可以用XSLT的<xsl:key>分组技巧来实现按Subsystem聚合,只显示唯一的分组标题,同时列出对应组下的所有输入名称。
先确认补全后的源XML:
<?xml version="1.0" encoding="UTF-8"?> <Mod> <Input1> <Name>BackInput</Name> <Transform> <Subsystem>Transmission</Subsystem> </Transform> </Input1> <Input2> <Name>NeutralInput</Name> <Transform> <Subsystem>Transmission</Subsystem> </Transform> </Input2> <Input3> <Name>LightingInput</Name> <Transform> <Subsystem>Lighting</Subsystem> </Transform> </Input3> </Mod>
下面是实现需求的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <!-- 定义分组规则:按Subsystem的值对所有Input开头的节点分组 --> <xsl:key name="subsystem-group" match="Mod/*[starts-with(local-name(), 'Input')]" use="Transform/Subsystem"/> <xsl:template match="/Mod"> <html> <body> <!-- 筛选出每个分组的第一个节点,确保只输出唯一的Subsystem标题 --> <xsl:for-each select="*[starts-with(local-name(), 'Input')][generate-id() = generate-id(key('subsystem-group', Transform/Subsystem)[1])]"> <h2><xsl:value-of select="Transform/Subsystem"/></h2> <!-- 遍历当前分组下的所有Input,列出名称 --> <ul> <xsl:for-each select="key('subsystem-group', Transform/Subsystem)"> <li><xsl:value-of select="Name"/></li> </xsl:for-each> </ul> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
代码逻辑说明:
<xsl:key>:创建分组索引,把所有Input节点按所属的Subsystem值归类。generate-id()对比:只保留每个分组的第一个节点,以此实现"唯一标题"的效果。- 内层循环:通过索引key取出当前分组下的所有Input节点,逐个输出名称。
最终输出效果:
<html> <body> <h2>Transmission</h2> <ul> <li>BackInput</li> <li>NeutralInput</li> </ul> <h2>Lighting</h2> <ul> <li>LightingInput</li> </ul> </body> </html>
如果需要调整输出格式(比如纯文本或自定义XML结构),只需修改<xsl:output>的method属性,替换对应的输出标签即可。
内容的提问来源于stack exchange,提问作者RJ7
相关产品推荐
相关产品推荐

