XSLT 1.0 POS节点映射异常排查:Position使用问题
修复XSLT 1.0中Siebel输出POS节点字段填充问题
问题诊断
常见导致字段未正确填充的原因包括:
- 条件判断逻辑不完整(比如只用了
<xsl:if>处理一种情况,遗漏了另一种) - 节点路径匹配错误(比如
returnCode的选择路径不符合输入XML结构) - 未正确处理空值输出(比如不符合条件时没有生成空节点或正确的默认值)
修复后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 生成Siebel根结构 --> <xsl:template match="/"> <SiebelOutput> <xsl:apply-templates select="Input/POS"/> </SiebelOutput> </xsl:template> <!-- 处理每个POS节点,严格遵循业务规则 --> <xsl:template match="POS"> <POS> <!-- CodiceSAP:仅当returnCode='00'时填充对应值 --> <CodiceSAP> <xsl:if test="returnCode = '00'"> <xsl:value-of select="sapCode"/> </xsl:if> </CodiceSAP> <!-- DescrizioneRitornoSAP:仅当returnCode≠'00'时填充返回消息 --> <DescrizioneRitornoSAP> <xsl:if test="returnCode != '00'"> <xsl:value-of select="returnMessage"/> </xsl:if> </DescrizioneRitornoSAP> <!-- StatoSAP:returnCode='00'时设为Attivo,否则为空 --> <StatoSAP> <xsl:if test="returnCode = '00'"> <xsl:text>Attivo</xsl:text> </xsl:if> </StatoSAP> <!-- StatoCommerciale:二选一逻辑,确保覆盖所有情况 --> <StatoCommerciale> <xsl:choose> <xsl:when test="returnCode = '00'">Attivo</xsl:when> <xsl:otherwise>Prospect</xsl:otherwise> </xsl:choose> </StatoCommerciale> <!-- 保留其他需要传递的字段 --> <xsl:copy-of select="*[not(local-name()='sapCode' or local-name()='returnCode' or local-name()='returnMessage')]"/> </POS> </xsl:template> </xsl:stylesheet>
关键修复说明
- 完整的条件覆盖:用
<xsl:choose>处理StatoCommerciale的二选一逻辑,确保无论returnCode是什么值,都能输出正确的状态值,避免遗漏情况。 - 精准的字段填充控制:对
CodiceSAP和DescrizioneRitornoSAP使用<xsl:if>,仅在符合条件时填充内容,不符合时生成空节点(符合Siebel的格式要求)。 - 节点路径准确性:确保
returnCode、sapCode、returnMessage的选择路径与输入XML的结构一致(示例中假设这些节点是POS的直接子节点,若实际结构不同需调整路径)。 - 高效的其他字段处理:用
<xsl:copy-of>批量复制不需要判断的字段,减少冗余代码。
示例验证
输入XML:
<Input> <POS> <sapCode>SAP-POS-001</sapCode> <returnCode>00</returnCode> <returnMessage>操作成功</returnMessage> <POSID>POS1001</POSID> </POS> <POS> <sapCode>SAP-POS-002</sapCode> <returnCode>01</returnCode> <returnMessage>无效的POS编码</returnMessage> <POSID>POS1002</POSID> </POS> </Input>
输出XML(符合Siebel格式):
<SiebelOutput> <POS> <CodiceSAP>SAP-POS-001</CodiceSAP> <DescrizioneRitornoSAP/> <StatoSAP>Attivo</StatoSAP> <StatoCommerciale>Attivo</StatoCommerciale> <POSID>POS1001</POSID> </POS> <POS> <CodiceSAP/> <DescrizioneRitornoSAP>无效的POS编码</DescrizioneRitornoSAP> <StatoSAP/> <StatoCommerciale>Prospect</StatoCommerciale> <POSID>POS1002</POSID> </POS> </SiebelOutput>
内容的提问来源于stack exchange,提问作者Rookie Programmer Aravind
相关产品推荐
相关产品推荐

