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

SAP PI中含递归节点的XML重构问题求助

SAP PI递归XML节点处理的XSLT修正方案

示例输入XML

<Root>
  <Container>
    <SSCC>SSCC123</SSCC>
    <OtherField>Value1</OtherField>
    <SubContainers>
      <Container>
        <SSCC>SSCC456</SSCC>
        <OtherField>Value2</OtherField>
        <SubContainers>
          <Container>
            <SSCC>SSCC789</SSCC>
            <OtherField>Value3</OtherField>
          </Container>
        </SubContainers>
      </Container>
    </SubContainers>
  </Container>
</Root>

预期输出XML

<Root>
  <Container>
    <SSCC>SSCC123</SSCC>
    <OtherField>Value1</OtherField>
  </Container>
  <Container>
    <SSCC>SSCC456</SSCC>
    <OtherField>Value2</OtherField>
    <ParentSSCC>SSCC123</ParentSSCC>
  </Container>
  <Container>
    <SSCC>SSCC789</SSCC>
    <OtherField>Value3</OtherField>
    <ParentSSCC>SSCC456</ParentSSCC>
  </Container>
</Root>

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 处理根节点,触发所有Container的递归处理 -->
  <xsl:template match="/Root">
    <Root>
      <xsl:apply-templates select="Container" mode="process">
        <xsl:with-param name="parentSSCC" select="''"/>
      </xsl:apply-templates>
    </Root>
  </xsl:template>

  <!-- 递归处理所有层级的Container节点 -->
  <xsl:template match="Container" mode="process">
    <xsl:param name="parentSSCC"/>
    
    <!-- 输出当前Container,剔除SubContainers元素 -->
    <Container>
      <xsl:copy-of select="*[not(local-name()='SubContainers')]"/>
      <!-- 若存在父SSCC,添加对应的节点 -->
      <xsl:if test="$parentSSCC != ''">
        <ParentSSCC><xsl:value-of select="$parentSSCC"/></ParentSSCC>
      </xsl:if>
    </Container>

    <!-- 递归处理当前Container下的子Container,传递当前SSCC作为父标识 -->
    <xsl:apply-templates select="SubContainers/Container" mode="process">
      <xsl:with-param name="parentSSCC" select="SSCC"/>
    </xsl:apply-templates>
  </xsl:template>

  <!-- 忽略无关节点,避免冗余输出 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

关键逻辑说明

  1. 递归遍历:通过带mode="process"的模板,递归处理所有层级的Container节点,不管嵌套多少层都能覆盖到。
  2. 剔除SubContainers:输出Container时,只复制除SubContainers之外的子节点,直接移除该嵌套容器元素。
  3. 父SSCC传递:处理子Container时,将父节点的SSCC值作为参数传递,在子节点中生成ParentSSCC节点。
  4. 根层级迁移:所有处理后的Container节点都直接输出到根节点下,实现嵌套节点的层级提升。

原XSLT常见问题排查

  • 未做递归处理:只处理了第一层嵌套的Container,深层级节点未被提取。
  • 未正确剔除SubContainers:仅隐藏该元素但未从输出中彻底移除,导致原父节点结构不符合要求。
  • 父SSCC传递逻辑错误:子节点未正确继承父节点的SSCC值,或添加的节点结构不对。
  • 未迁移到根层级:嵌套的Container仍保留在原父节点内部,未成为根下的同级节点。

内容的提问来源于stack exchange,提问作者Mike Dole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:05:14