XSLT多GS9场景下保留每个GS9最后一个GS15的问题排查
问题排查与解决方案
问题根源
- 原代码里的
//GS15[last()]是选取整个文档中最后一个GS15节点,而非当前GS9节点下的最后一个GS15,导致多GS9场景下只有最后一个GS9里的最后一个GS15被保留,其他GS9内的GS15全被删除。 - 错误地将保留的GS15节点重命名为
G_SG15,不符合输出要求。 - 定义的
gs15key未被使用,属于冗余代码。
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <!-- 身份模板:默认复制所有节点和属性 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 处理GS9节点:保留所有子节点,仅保留最后一个GS15 --> <xsl:template match="GS9"> <xsl:copy> <!-- 复制GS9下除GS15外的所有子节点 --> <xsl:apply-templates select="node()[not(self::GS15)]"/> <!-- 如果存在GS15节点,复制最后一个 --> <xsl:if test="GS15"> <xsl:apply-templates select="GS15[last()]"/> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 保留核心的身份模板,确保所有未被特殊处理的节点和属性都原样复制。
- 针对
GS9节点单独处理:先复制除GS15外的所有子节点,再检查当前GS9下是否存在GS15,如果存在则仅复制最后一个。 - 完全符合需求规则:单个GS15/无GS15的GS9原样保留,多GS15的GS9只留最后一个,非GS9节点不受影响。
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

