SAP CPI中XSLT条件更新XML节点值异常问题求助
SAP CPI中XSLT条件更新XML节点值的问题修正
需求说明
仅当同层级的D_3035字段值为SU时,将D_3055字段值从9替换为92;若D_3035为BY/CA/ST等其他值,D_3055保持原有值。当前实现错误地将所有D_3055都修改为92。
相关代码与数据
源XML示例
<Root> <Item> <D_3035>SU</D_3035> <D_3055>9</D_3055> </Item> <Item> <D_3035>BY</D_3035> <D_3055>9</D_3055> </Item> <Item> <D_3035>CA</D_3035> <D_3055>9</D_3055> </Item> </Root>
错误XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="D_3055"> <D_3055> <xsl:if test="../D_3035='SU'">92</xsl:if> <xsl:if test="../D_3035!='SU'"><xsl:value-of select="."/></xsl:if> </D_3055> </xsl:template> </xsl:stylesheet>
错误输出XML
<Root> <Item> <D_3035>SU</D_3035> <D_3055>92</D_3055> </Item> <Item> <D_3035>BY</D_3035> <D_3055>92</D_3055> <!-- 错误:应保留原值9 --> </Item> <Item> <D_3035>CA</D_3035> <D_3055>92</D_3055> <!-- 错误:应保留原值9 --> </Item> </Root>
期望输出XML
<Root> <Item> <D_3035>SU</D_3035> <D_3055>92</D_3055> </Item> <Item> <D_3035>BY</D_3035> <D_3055>9</D_3055> </Item> <Item> <D_3035>CA</D_3035> <D_3055>9</D_3055> </Item> </Root>
问题根源
错误代码的核心问题在于:
- 未对
D_3055的原始值做判断,若需求是仅当D_3055原值为9时才替换,现有代码未覆盖该条件。 - 若源XML存在命名空间,
../D_3035的路径匹配会失效,导致两个<xsl:if>都不触发,若代码隐含默认输出92(比如书写失误),则所有D_3055都会被设置为92。 - 采用多
<xsl:if>的写法逻辑冗余,容易出现分支覆盖不全的问题。
修正后的XSLT代码
采用精准模板匹配的方式,仅对符合双重条件的D_3055节点进行替换,其余节点保持原样:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 身份模板:复制所有未被特殊匹配的节点,保留原有结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 仅匹配:D_3055原值为9 且 同层级D_3035值为SU的节点,替换为92 --> <xsl:template match="D_3055[.='9' and ../D_3035='SU']"> <D_3055>92</D_3055> </xsl:template> </xsl:stylesheet>
若需求简化为只要D_3035为SU,就将D_3055改为92(不管原值),可将匹配条件改为:
<xsl:template match="D_3055[../D_3035='SU']"> <D_3055>92</D_3055> </xsl:template>
验证结果
使用修正后的XSLT处理源XML,可得到符合预期的输出:仅D_3035=SU对应的D_3055被改为92,其余节点保持原值。
内容的提问来源于stack exchange,提问作者young soo kim
相关产品推荐
相关产品推荐

