XSLT1.0复制节点新增QTY元素时遗漏节点问题如何修复
问题原因
XSLT 1.0 规范中,当多个模板的匹配优先级完全一致时,处理器只会选择最后声明的模板执行。你写了两个匹配SG26的模板优先级相同,所以始终只有最后一个新增E6063=60的模板生效,新增E6063=59的模板永远不会被触发。
修复方案
将两个新增QTY的逻辑合并到同一个SG26匹配模板中,分别判断对应值的QTY是否存在,不存在则插入对应节点:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext" exclude-result-prefixes="ext msxml"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="SG26"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <!-- 判断是否存在E6063=59的QTY,不存在则新增 --> <xsl:if test="not(QTY/C186/E6063=59)"> <QTY> <C186> <E6063>59</E6063> <E6060>status</E6060> <E6411>status</E6411> </C186> </QTY> </xsl:if> <!-- 判断是否存在E6063=60的QTY,不存在则新增 --> <xsl:if test="not(QTY/C186/E6063=60)"> <QTY> <C186> <E6063>60</E6063> <E6060>status2</E6060> <E6411>status2</E6411> </C186> </QTY> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet>
该写法保留了原有的身份复制逻辑,所有原有节点都会完整保留,新增的QTY会追加到SG26节点的末尾,符合顺序无要求的需求。如果后续需要新增更多E6063值的QTY,只需要在同一个模板里追加对应的xsl:if判断即可。
内容的提问来源于stack exchange,提问作者Petrucho
相关产品推荐
相关产品推荐

