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>
关键逻辑说明
- 递归遍历:通过带
mode="process"的模板,递归处理所有层级的Container节点,不管嵌套多少层都能覆盖到。 - 剔除SubContainers:输出
Container时,只复制除SubContainers之外的子节点,直接移除该嵌套容器元素。 - 父SSCC传递:处理子
Container时,将父节点的SSCC值作为参数传递,在子节点中生成ParentSSCC节点。 - 根层级迁移:所有处理后的
Container节点都直接输出到根节点下,实现嵌套节点的层级提升。
原XSLT常见问题排查
- 未做递归处理:只处理了第一层嵌套的
Container,深层级节点未被提取。 - 未正确剔除
SubContainers:仅隐藏该元素但未从输出中彻底移除,导致原父节点结构不符合要求。 - 父SSCC传递逻辑错误:子节点未正确继承父节点的
SSCC值,或添加的节点结构不对。 - 未迁移到根层级:嵌套的
Container仍保留在原父节点内部,未成为根下的同级节点。
内容的提问来源于stack exchange,提问作者Mike Dole
相关产品推荐
相关产品推荐

