Reputation: 12154
This is input XML:
<deliveryStatusRequest>
<Partner>
<partyRoleId>A47422</partyRoleId>
<Banner>
<partyRoleId>A47423</partyRoleId>
<POS>
<partyRoleId>A47424</partyRoleId>
</POS>
<POS>
<partyRoleId>A47425</partyRoleId>
</POS>
</Banner>
<Banner>
<partyRoleId>A47426</partyRoleId>
<POS>
<partyRoleId>A47428</partyRoleId>
</POS>
</Banner>
</Partner>
<ProcessData>
<Partner>
<returnCode>00</returnCode>
<returnDescription>123456789</returnDescription>
<Banner>
<returnCode>00</returnCode>
<returnDescription>234567890</returnDescription>
<POS>
<returnCode>01</returnCode>
<returnDescription>Some error</returnDescription>
</POS>
<POS>
<returnCode>00</returnCode>
<returnDescription>456789012</returnDescription>
</POS>
</Banner>
<Banner>
<returnCode>00</returnCode>
<returnDescription>567890123</returnDescription>
<POS>
<returnCode>02</returnCode>
<returnDescription>Some Error</returnDescription>
</POS>
</Banner>
</Partner>
</ProcessData>
</deliveryStatusRequest>
This is expected output:
<SiebelMessage
MessageType="Integration Object"
IntObjectName="SFA Create Update Seller IO"
IntObjectFormat="Siebel Hierarchical">
<ListOfSfaCreateUpdateSellerIo>
<SfaSubAccountmasterBc>
<CodiceSFA/> <!--Mapped to PartyRowId-->
<CodiceSAP> <!--Mapped to returnDescription if returnCode is 00-->
<StatoSAP> <!--"Attivo" If returnCode is 00 -->
<StatoCommerciale> <!-- "Attivo" If returnCode is 00 else set to "Prospect"-->
<DescrizioneRitornoSAP> <!--Mapped to returnDescription if returnCode is not 00-->
<ListOfSfaSubaccountInsegnaBc>
<SfaSubaccountInsegnaBc>
<CodiceSFA/> <!--Mapped to PartyRowId-->
<CodiceSAP> <!--Mapped to returnDescription if returnCode is 00-->
<StatoSAP> <!--"Attivo" If returnCode is 00 -->
<StatoCommerciale> <!-- "Attivo" If returnCode is 00 else set to "Prospect"-->
<DescrizioneRitornoSAP> <!--Mapped to returnDescription if returnCode is not 00-->
<ListOfSfaSubaccountPdvBc>
<SfaSubaccountPdvBc>
<CodiceSFA/> <!--Mapped to PartyRowId-->
<CodiceSAP> <!--Mapped to returnDescription if returnCode is 00--
<StatoSAP> <!--"Attivo" If returnCode is 00 -->
<StatoCommerciale> <!-- "Attivo" If returnCode is 00 else set to "Prospect"-->
<DescrizioneRitornoSAP> <!--Mapped to returnDescription if returnCode is not 00-->
</SfaSubaccountPdvBc>
</ListOfSfaSubaccountPdvBc>
</SfaSubaccountInsegnaBc>
</ListOfSfaSubaccountInsegnaBc>
</SfaSubAccountmasterBc>
</ListOfSfaCreateUpdateSellerIo>
</SiebelMessage>
XSLT I've created, but it's not working:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="deliveryStatusRequest">
<SiebelMessage MessageType="Integration Object" IntObjectName="SFA Create Update Seller IO" IntObjectFormat="Siebel Hierarchical">
<ListOfSfaCreateUpdateSellerIo>
<xsl:apply-templates select="Partner"/>
</ListOfSfaCreateUpdateSellerIo>
</SiebelMessage>
</xsl:template>
<xsl:template match="Partner">
<SfaSubAccountmasterBc>
<CodiceSFA><xsl:value-of select="partyRoleId"/></CodiceSFA>
<CodiceSAP>
<xsl:if test="../ProcessData/Partner/returnCode = '00'">
<xsl:value-of select="../ProcessData/Partner/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="../ProcessData/Partner/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="../ProcessData/Partner/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="../ProcessData/Partner/returnCode != '00'">
<xsl:value-of select="../ProcessData/Partner/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
<ListOfSfaSubaccountInsegnaBc>
<xsl:apply-templates select="Banner"/>
</ListOfSfaSubaccountInsegnaBc>
</SfaSubAccountmasterBc>
</xsl:template>
<xsl:template match="Banner">
<SfaSubaccountInsegnaBc>
<CodiceSFA><xsl:value-of select="partyRoleId"/></CodiceSFA>
<xsl:variable name="bannerIndex" select="count(preceding-sibling::Banner) + 1"/>
<CodiceSAP>
<xsl:if test="../../ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">
<xsl:value-of select="../../ProcessData/Partner/Banner[$bannerIndex]/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="../../ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="../../ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="../../ProcessData/Partner/Banner[$bannerIndex]/returnCode != '00'">
<xsl:value-of select="../../ProcessData/Partner/Banner[$bannerIndex]/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
<ListOfSfaSubaccountPdvBc>
<xsl:apply-templates select="POS"/>
</ListOfSfaSubaccountPdvBc>
</SfaSubaccountInsegnaBc>
</xsl:template>
<xsl:template match="POS">
<SfaSubaccountPdvBc>
<CodiceSFA><xsl:value-of select="partyRoleId"/></CodiceSFA>
<xsl:variable name="bannerIndex" select="count(../../preceding-sibling::Banner) + 1"/>
<xsl:variable name="posIndex" select="count(preceding-sibling::POS) + 1"/>
<CodiceSAP>
<xsl:if test="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">
<xsl:value-of select="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode != '00'">
<xsl:value-of select="../../../../ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
</SfaSubaccountPdvBc>
</xsl:template>
</xsl:stylesheet>
I'm getting output like this, Under POS it's not mapping the output correctly. It's not even mapping ReturnDescription to Description tag.
<?xml version="1.0" encoding="UTF-8"?>
<SiebelMessage MessageType="Integration Object"
IntObjectName="SFA Create Update Seller IO"
IntObjectFormat="Siebel Hierarchical">
<ListOfSfaCreateUpdateSellerIo>
<SfaSubAccountmasterBc>
<CodiceSFA>A47422</CodiceSFA>
<CodiceSAP>123456789</CodiceSAP>
<StatoSAP>Attivo</StatoSAP>
<StatoCommerciale>Attivo</StatoCommerciale>
<DescrizioneRitornoSAP/>
<ListOfSfaSubaccountInsegnaBc>
<SfaSubaccountInsegnaBc>
<CodiceSFA>A47423</CodiceSFA>
<CodiceSAP>234567890</CodiceSAP>
<StatoSAP>Attivo</StatoSAP>
<StatoCommerciale>Attivo</StatoCommerciale>
<DescrizioneRitornoSAP/>
<ListOfSfaSubaccountPdvBc>
<SfaSubaccountPdvBc>
<CodiceSFA>A47424</CodiceSFA>
<CodiceSAP/>
<StatoSAP/>
<StatoCommerciale>Prospect</StatoCommerciale>
<DescrizioneRitornoSAP/>
</SfaSubaccountPdvBc>
<SfaSubaccountPdvBc>
<CodiceSFA>A47425</CodiceSFA>
<CodiceSAP/>
<StatoSAP/>
<StatoCommerciale>Prospect</StatoCommerciale>
<DescrizioneRitornoSAP/>
</SfaSubaccountPdvBc>
</ListOfSfaSubaccountPdvBc>
</SfaSubaccountInsegnaBc>
<SfaSubaccountInsegnaBc>
<CodiceSFA>A47426</CodiceSFA>
<CodiceSAP>567890123</CodiceSAP>
<StatoSAP>Attivo</StatoSAP>
<StatoCommerciale>Attivo</StatoCommerciale>
<DescrizioneRitornoSAP/>
<ListOfSfaSubaccountPdvBc>
<SfaSubaccountPdvBc>
<CodiceSFA>A47428</CodiceSFA>
<CodiceSAP/>
<StatoSAP/>
<StatoCommerciale>Prospect</StatoCommerciale>
<DescrizioneRitornoSAP/>
</SfaSubaccountPdvBc>
</ListOfSfaSubaccountPdvBc>
</SfaSubaccountInsegnaBc>
</ListOfSfaSubaccountInsegnaBc>
</SfaSubAccountmasterBc>
</ListOfSfaCreateUpdateSellerIo>
</SiebelMessage>
This is the logic: CodiceSAP for POS: Populate CodiceSAP if returnCode = '00'. DescrizioneRitornoSAP for POS: Populate only when returnCode != '00'. StatoSAP and StatoCommerciale for POS: Set to Attivo when returnCode = '00'; otherwise, default "" (StatoSAP) and "Prospect" (for StatoCommerciale).
Upvotes: 1
Views: 34
Reputation: 12154
Answer posted by Martin worked, meanwhile I too tried with for-each instead of template match and also made global navigation for "//processdata", it worked for me. Both answers are correct!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<SiebelMessage MessageType="Integration Object" IntObjectName="SFA Create Update Seller IO" IntObjectFormat="Siebel Hierarchical">
<ListOfSfaCreateUpdateSellerIo>
<SfaSubAccountmasterBc>
<xsl:for-each select="deliveryStatusRequest/Partner">
<CodiceSFA>
<xsl:value-of select="partyRoleId"/>
</CodiceSFA>
<CodiceSAP>
<xsl:if test="../ProcessData/Partner/returnCode = '00'">
<xsl:value-of select="../ProcessData/Partner/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="../ProcessData/Partner/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="../ProcessData/Partner/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="../ProcessData/Partner/returnCode != '00'">
<xsl:value-of select="../ProcessData/Partner/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
<ListOfSfaSubaccountInsegnaBc>
<xsl:for-each select="Banner">
<CodiceSFA><xsl:value-of select="partyRoleId"/></CodiceSFA>
<xsl:variable name="bannerIndex" select="count(preceding-sibling::Banner) + 1"/>
<CodiceSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">
<xsl:value-of select="//ProcessData/Partner/Banner[$bannerIndex]/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="//ProcessData/Partner/Banner[$bannerIndex]/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/returnCode != '00'">
<xsl:value-of select="//ProcessData/Partner/Banner[$bannerIndex]/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
<ListOfSfaSubaccountPdvBc>
<xsl:for-each select="POS">
<SfaSubaccountPdvBc>
<CodiceSFA><xsl:value-of select="partyRoleId"/></CodiceSFA>
<xsl:variable name="posIndex" select="count(preceding-sibling::POS) + 1"/>
<CodiceSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">
<xsl:value-of select="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnDescription"/>
</xsl:if>
</CodiceSAP>
<StatoSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">Attivo</xsl:if>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:if test="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnCode != '00'">
<xsl:value-of select="//ProcessData/Partner/Banner[$bannerIndex]/POS[$posIndex]/returnDescription"/>
</xsl:if>
</DescrizioneRitornoSAP>
</SfaSubaccountPdvBc>
</xsl:for-each>
</ListOfSfaSubaccountPdvBc>
</xsl:for-each>
</ListOfSfaSubaccountInsegnaBc>
</xsl:for-each>
</SfaSubAccountmasterBc>
</ListOfSfaCreateUpdateSellerIo>
</SiebelMessage>
</xsl:template>
</xsl:stylesheet>
Upvotes: 0
Reputation: 167401
I think you need to move one level ..
up higher to populate CodiceSAP
e.g.
<xsl:template match="Banner">
<SfaSubaccountInsegnaBc>
<CodiceSFA>
<xsl:value-of select="partyRoleId"/>
</CodiceSFA>
<CodiceSAP>
<xsl:choose>
<xsl:when test="../../ProcessData/Partner/Banner[position() = count(preceding-sibling::Banner) + 1]/returnCode = '00'">
<xsl:value-of select="../../ProcessData/Partner/Banner[position() = count(preceding-sibling::Banner) + 1]/returnDescription"/>
</xsl:when>
</xsl:choose>
</CodiceSAP>
For the POS
elements, your code was looking at one level to high, i.e. it seems you rather wanted
<xsl:template match="POS">
<SfaSubaccountPdvBc>
<CodiceSFA>
<xsl:value-of select="partyRoleId"/>
</CodiceSFA>
<CodiceSAP>
<xsl:choose>
<xsl:when test="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnCode = '00'">
<xsl:value-of select="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnDescription"/>
</xsl:when>
</xsl:choose>
</CodiceSAP>
<StatoSAP>
<xsl:choose>
<xsl:when test="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnCode = '00'">Attivo</xsl:when>
</xsl:choose>
</StatoSAP>
<StatoCommerciale>
<xsl:choose>
<xsl:when test="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnCode = '00'">Attivo</xsl:when>
<xsl:otherwise>Prospect</xsl:otherwise>
</xsl:choose>
</StatoCommerciale>
<DescrizioneRitornoSAP>
<xsl:choose>
<xsl:when test="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnCode != '00'">
<xsl:value-of select="../../../ProcessData/Partner/Banner[position() = count(../../preceding-sibling::Banner) + 1]/POS[position() = count(preceding-sibling::POS) + 1]/returnDescription"/>
</xsl:when>
</xsl:choose>
</DescrizioneRitornoSAP>
</SfaSubaccountPdvBc>
</xsl:template>
Upvotes: 1