shibu
shibu

Reputation: 5

How to Skip segment based on a field value in XSLT

I have an XML input which i have to map into a target structure

Here is the link to Fiddler: LINK

<?xml version='1.0' encoding='UTF-8'?>
<root>
    <d>
        <Campaign>
            <CampaignId>0000000112</CampaignId>
            <Name>Connected Water DMI Fail Test</Name>
            <MarketingAreaId>CXXGLOBAL</MarketingAreaId>
            <SegmentationObject>SAP_CONTACT_ENGAGEMENT_SIN</SegmentationObject>
            <ImplementationId>ZOC_EXPORT_ACOUSTIC</ImplementationId>
        </Campaign>
        <PackageId>47</PackageId>
        <ExecutionStartDateTime>2021-06-30T15:28:49Z</ExecutionStartDateTime>
        <ExecutionRunKey>42010A0350331EDBB6B6EDEF969FD623</ExecutionRunKey>
        <CampaignTargetGroupMembers>
            <OutboundId>A071C1B1F437B581DC597E5116B38BED039CA864</OutboundId>
            <PackageId>47</PackageId>
            <ExecutionRunKey>42010A0350331EDBB6B6EDEF969FD623</ExecutionRunKey>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-SMTP_ADDR</AttributeId>
                <Value></Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>A071C1B1F437B581DC597E5116B38BED039CA864</OutboundId>
            </TargetGroupMemberAttributeData>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_LAST</AttributeId>
                <Value>Bailey</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>A071C1B1F437B581DC597E5116B38BED039CA864</OutboundId>
            </TargetGroupMemberAttributeData>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_FIRST</AttributeId>
                <Value>Chandler</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>A071C1B1F437B581DC597E5116B38BED039CA864</OutboundId>
            </TargetGroupMemberAttributeData>
        </CampaignTargetGroupMembers>
        <CampaignTargetGroupMembers>
            <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            <PackageId>47</PackageId>
            <ExecutionRunKey>42010A0350331EDBB6B6EDEF969FD623</ExecutionRunKey>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-SMTP_ADDR</AttributeId>
                <Value>[email protected]</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            </TargetGroupMemberAttributeData>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_LAST</AttributeId>
                <Value>Carmona</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            </TargetGroupMemberAttributeData>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_FIRST</AttributeId>
                <Value>Ruben</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            </TargetGroupMemberAttributeData>                           
        </CampaignTargetGroupMembers>
    </d>
</root>

I have to write XSLT code so that node and subnodes only get copied and formatted with new field names when AttributeId = DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-SMTP_ADDR and corresponding Value != ''

How do i modify XSLT Code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
      </xsl:template>
        <xsl:variable name="campaign" select="root/d/Campaign/CampaignId/text()" />
        <xsl:template match="TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_FIRST']">
            <FIRST_NAME><xsl:value-of select="Value"/></FIRST_NAME>
       </xsl:template>  
       <xsl:template match="TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_LAST']">
            <LAST_NAME><xsl:value-of select="Value" /></LAST_NAME>
     <xsl:template match="CampaignTargetGroupMembers/ExecutionRunKey">
            <CAMPAIGN_ID><xsl:copy-of select="$campaign"/></CAMPAIGN_ID>
       </xsl:template> 
       <xsl:template match="TargetGroupMemberAttributeData[AttributeId='OUTBOUND_INTERACTION']">
            <UUID><xsl:value-of select="Value" /></UUID>
       </xsl:template> 
    </xsl:stylesheet>

The output Should be:

<?xml version="1.0" encoding="UTF-8"?><root>
    <d>
        <Campaign>
            <CampaignId>0000000112</CampaignId>
            <Name>Connected Water DMI Fail Test</Name>
            <MarketingAreaId>CXXGLOBAL</MarketingAreaId>
            <SegmentationObject>SAP_CONTACT_ENGAGEMENT_SIN</SegmentationObject>
            <ImplementationId>ZOC_EXPORT_ACOUSTIC</ImplementationId>
        </Campaign>
        <PackageId>47</PackageId>
        <ExecutionStartDateTime>2021-06-30T15:28:49Z</ExecutionStartDateTime>
        <ExecutionRunKey>42010A0350331EDBB6B6EDEF969FD623</ExecutionRunKey>
        <CampaignTargetGroupMembers>
            <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            <PackageId>47</PackageId>
            <CAMPAIGN_ID>0000000112</CAMPAIGN_ID>
            <Email>[email protected]</Email>
            <LAST_NAME>Carmona</LAST_NAME>
            <FIRST_NAME>Ruben</FIRST_NAME>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-INITIATIVE_ID</AttributeId>
                <Value>0000000105,0000000092,0000000041,,0000000054,0000000076</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            </TargetGroupMemberAttributeData>           
        </CampaignTargetGroupMembers>
    </d>
</root>

Upvotes: 0

Views: 164

Answers (1)

zx485
zx485

Reputation: 29052

To get the desired output, you can use the following stylesheet. But not all values could be derived from your source, so I put in some static values. I guess that you could fill in the rest.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="campaign" select="root/d/Campaign/CampaignId/text()" />
    <xsl:mode on-no-match="shallow-copy" />
    <xsl:strip-space elements="*" />

    <xsl:template match="CampaignTargetGroupMembers | TargetGroupMemberAttributeData" />

    <xsl:template match="CampaignTargetGroupMembers[TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-SMTP_ADDR' and Value!='']]">
      <xsl:copy>
          <xsl:apply-templates select="@* | OutboundId | PackageId"/>
          <CAMPAIGN_ID><xsl:value-of select="$campaign" /></CAMPAIGN_ID>
          <Email><xsl:value-of select="TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-SMTP_ADDR']/Value" /></Email>
          <LAST_NAME><xsl:value-of select="TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_LAST']/Value" /></LAST_NAME>
          <FIRST_NAME><xsl:value-of select="TargetGroupMemberAttributeData[AttributeId='DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-NAME_FIRST']/Value"/></FIRST_NAME>
          <TargetGroupMemberAttributeData>
            <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-INITIATIVE_ID</AttributeId>
            <Value>0000000105,0000000092,0000000041,,0000000054,0000000076</Value>
            <EdmTypeId><xsl:value-of select="TargetGroupMemberAttributeData[1]/EdmTypeId" /></EdmTypeId>
            <OutboundId><xsl:value-of select="TargetGroupMemberAttributeData[1]/OutboundId" /></OutboundId>
          </TargetGroupMemberAttributeData> 
      </xsl:copy>
    </xsl:template>    
       
</xsl:stylesheet>

Its output is:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <d>
        <Campaign>
            <CampaignId>0000000112</CampaignId>
            <Name>Connected Water DMI Fail Test</Name>
            <MarketingAreaId>CXXGLOBAL</MarketingAreaId>
            <SegmentationObject>SAP_CONTACT_ENGAGEMENT_SIN</SegmentationObject>
            <ImplementationId>ZOC_EXPORT_ACOUSTIC</ImplementationId>
        </Campaign>
        <PackageId>47</PackageId>
        <ExecutionStartDateTime>2021-06-30T15:28:49Z</ExecutionStartDateTime>
        <ExecutionRunKey>42010A0350331EDBB6B6EDEF969FD623</ExecutionRunKey>
        <CampaignTargetGroupMembers>
            <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            <PackageId>47</PackageId>
            <CAMPAIGN_ID>0000000112</CAMPAIGN_ID>
            <Email>[email protected]</Email>
            <LAST_NAME>Carmona</LAST_NAME>
            <FIRST_NAME>Ruben</FIRST_NAME>
            <TargetGroupMemberAttributeData>
                <AttributeId>DA-_SAP_CF_CE_CONTACT_IA_ERP_CUST-INITIATIVE_ID</AttributeId>
                <Value>0000000105,0000000092,0000000041,,0000000054,0000000076</Value>
                <EdmTypeId>Edm.String</EdmTypeId>
                <OutboundId>E6713D258EAC1ADACE6AC905BB3ECF5E1CEF4776</OutboundId>
            </TargetGroupMemberAttributeData>
        </CampaignTargetGroupMembers>
    </d>
</root>

Which is as desired (with some static values which cannot be deduced from the input XML).

Upvotes: 0

Related Questions