This Wiki is based on TechNet Wiki Forum Post: source record is missing but still need to identify it and map to target record

Problem

In some cases we need to create destination schema record even if we are not getting respective source record. We can use Logical Existence functoid in fields mapping but it will create destination record only in case we have a source record (empty record will work e.g. <Record />).

Solution

This solution is created for the case where we have no source record and we have to create respective destination record (with default value "NA"). It is achieved by using XSLT as an alternative.

Source Schema

Destination Schema

Custom XSLT for Map


<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var s0 userCSharp" version="1.0" xmlns:ns0="http://LogicalExistenceThroughXSLT.DestinationSchema" xmlns:s0="http://LogicalExistenceThroughXSLT.SourceSchema" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="/s0:Orders" />
  </xsl:template>
  <xsl:template match="/s0:Orders">
    <xsl:variable name="var:d1" select="count(Order/Detail)" />
    <ns0:Order>
      <Header>
        <ID>
          <xsl:value-of select="Order/Header/ID/text()" />
        </ID>
      </Header>
      <xsl:if test="string($var:d1)>'0'">
        <xsl:for-each select="Order/Detail">
          <Detail>
              <DID>
                <xsl:value-of select="DID/text()" />
              </DID>
              <QTY>
                <xsl:value-of select="QTY/text()" />
              </QTY>
          </Detail>
        </xsl:for-each>
      </xsl:if>
      <xsl:if test="string($var:d1)='0'">
        <Detail>
          <DID>
            <xsl:text>NA</xsl:text>
          </DID>
          <QTY>
            <xsl:text>NA</xsl:text>
          </QTY>
        </Detail>
      </xsl:if>
    </ns0:Order>
  </xsl:template>
</xsl:stylesheet>

Sample Input 1


  <Order>
    <Header>
      <ID>1</ID>
    </Header>
  </Order>
</ns0:Orders>

Sample Output 1


  <Header>
    <ID>1</ID>
  </Header>
  <Detail>
    <DID>NA</DID>
    <QTY>NA</QTY>
  </Detail>
</ns0:Order>

Sample Input 2


  <Order>
    <Header>
      <ID>1</ID>
    </Header>
    <Detail>
      <DID>1</DID>
      <QTY>10</QTY>
    </Detail>
  </Order>
</ns0:Orders>

Sample Output 2


  <Header>
    <ID>1</ID>
  </Header>
  <Detail>
    <DID>1</DID>
    <QTY>10</QTY>
  </Detail>
</ns0:Order>

Source Code

Sample code can be downloaded from TechNet Gallery:

See Also

Another important place to find a huge amount of BizTalk related articles is the TechNet Wiki itself. The best entry point is BizTalk Server Resources on the TechNet Wiki.