如何在XSLT中移除内容重复的mnemonic?给定模板匹配head.block/codes.head
移除XML中重复mnemonic节点的XSLT实现
需求说明
给定输入XML,需移除所有包含重复md.mnem值的grade.content节点,仅保留第一个出现的对应节点,最终输出符合示例要求的结构。
实现代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 定义键,按md.mnem值对grade.content节点分组 --> <xsl:key name="mnemGroup" match="grade.content" use="head.block/codes.head/@md.mnem"/> <!-- 移除重复节点:仅保留每个md.mnem分组的第一个节点 --> <xsl:template match="grade.content[not(generate-id() = generate-id(key('mnemGroup', head.block/codes.head/@md.mnem)[1]))]"/> </xsl:stylesheet>
代码说明
- 身份模板:保证未被特殊规则匹配的节点和属性原样复制,维持XML基础结构完整。
- 分组键定义:以
codes.head的md.mnem属性值为标识,将同标识的grade.content节点归为一组。 - 重复节点过滤:匹配非分组内第一个出现的
grade.content节点,不进行复制输出,实现去重效果。
若需要更严格的重复判断(比如结合legacy.identifier和节点内容),可修改键的匹配规则为:
<xsl:key name="mnemGroup" match="grade.content" use="concat(@legacy.identifier, head.block/codes.head/@md.mnem, head.block/codes.head/head.info)"/>
内容的提问来源于stack exchange,提问作者Meetanshi Rawat
相关产品推荐
相关产品推荐

