如何在XSLT 2.0中基于元素值获取唯一节点?
基于Container值筛选唯一DR-Item节点并生成指定输出
XSLT 1.0 实现(兼容性更强)
使用Muenchian分组是XSLT 1.0中处理节点去重的标准方法,以下是完整的转换代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 按Container文本值对DR-Item节点分组 --> <xsl:key name="container-group" match="DR-Item" use="Container"/> <xsl:template match="/"> <!-- 筛选每个分组中的第一个节点(即唯一Container对应的节点) --> <xsl:for-each select="Body/DR/DR-Item[count(. | key('container-group', Container)[1]) = 1]"> <GM> <!-- 复制需要的子节点 --> <xsl:copy-of select="Container"/> <xsl:copy-of select="r"/> <xsl:copy-of select="t"/> </GM> </xsl:for-each> </xsl:template> </xsl:stylesheet>
XSLT 2.0+ 实现(写法更简洁)
如果使用支持XSLT 2.0及以上版本的处理器,可以直接使用分组语法简化代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <!-- 按Container值分组DR-Item节点 --> <xsl:for-each-group select="Body/DR/DR-Item" group-by="Container"> <GM> <!-- 取当前组第一个节点的指定子节点 --> <xsl:copy-of select="current-group()[1]/(Container, r, t)"/> </GM> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
核心逻辑说明
两种方法的核心都是对DR-Item节点按Container的值进行分组,然后只处理每个分组中的第一个节点,最终生成包含Container、r、t的<GM>元素,完全匹配你需要的输出格式。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

