You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题根源

错误代码的核心问题在于:

  1. 未对D_3055的原始值做判断,若需求是仅当D_3055原值为9时才替换,现有代码未覆盖该条件。
  2. 若源XML存在命名空间,../D_3035的路径匹配会失效,导致两个<xsl:if>都不触发,若代码隐含默认输出92(比如书写失误),则所有D_3055都会被设置为92。
  3. 采用多<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:40:48