selective mapping, can it be done?
Hi All,
I am currently facing a mapping challenge: I have the source schema that looks like this:
Header
Name
PONum
ShippingDate
Items_Loop
Item
Code
Color
Weight
The destination schema looks like:
Header
Name
MainLoop
PONum
ShippingDate
Code
Color
Weight
The problem is that in the MainLoop, the information that is mapped differs in the first two iterations:
Iteration 1: Map PONum Only
Iteration 2: Map ShippingDate Only
Iteration 3: Map item 1
Iteration 4: Map item 2
and so on...
How can this be accomplished with a biztalk map, what functoid should be used.
Thank a lot!
Answers
- Please ignore my previous post. I found a much better solution and you can read about it in my follow up blog post http://benrunchey.wordpress.com/2008/02/19/finding-out-the-mapper-can-do-what-i-want-it-to-do/
I much prefer this solution to my previous one!
- Code Snippet<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='G'">
<Value>
<xsl:value-of select="$var:Measurement_value" />
</Value>
</xsl:if>
</xsl:if>
</xsl:for-each><Unit>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='G'">
<xsl:value-of select="$var:unit_qualifier" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</Unit>
</Weight><Volume>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='AAW'">
<Value>
<xsl:value-of select="$var:Measurement_value" />
</Value>
</xsl:if>
</xsl:if>
</xsl:for-each><Unit>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='AAW'">
<xsl:value-of select="$var:unit_qualifier" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</Unit>For example, It is a code for mapping the EDIFACT_CUSCAR_D_95B schema.
All Replies
So are you looking to have a Destination document that looks like this...
Header
Name
MainLoop
PONum
MainLoop
ShippingDate
MainLoop
Code
Color
Weight
MainLoop
Code
Color
Weight
Hi
This is a very complicated scenario but You can use a check functiod on the iteration number. I think I will write a blog anoput this if you can send me the schemas and a sample I would appreciate it thanks
- It is very typical case in EDI schemas.I use the Xslt script functoids for it. Nothing special. If you give us the source and destination schemas (of course only part of them) we could help you.
Thank all of you for your quick responses. Yes it is an EDI case indeed. The following are oversimplified versions of the schemas I am using:
Source Schema:
<?xml version="1.0" encoding="utf-16"?>
<xs
chema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://FlatFileTest.SrcSchema" targetNamespace="http://FlatFileTest.SrcSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Header">
<xs:complexType>
<xs
equence>
<xs:element name="PONum" type="xs
tring" />
<xs:element name="Name" type="xs
tring" />
<xs:element name="PODate" type="xs
tring" />
<xs:element name="ShippingNum" type="xs
tring" />
<xs:element name="ShippingDate" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="Items">
<xs:complexType>
<xs
equence>
<xs:element minOccurs="1" maxOccurs="9999" name="Item">
<xs:complexType>
<xs
equence>
<xs:element name="Code" type="xs
tring" />
<xs:element name="Size" type="xs
tring" />
<xs:element name="Color" type="xs
tring" />
<xs:element name="Qty" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
</xs
equence>
</xs:complexType>
</xs:element>
</xs
chema>The destination schema is itself the ANSI X12 856 schema that is found in the Biztalk installation directory, but here I put just a representaiton of it:
<?xml version="1.0" encoding="utf-16"?>
<xs
chema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://FlatFileTest.DestSchema" targetNamespace="http://FlatFileTest.DestSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="X12_00401_856">
<xs:complexType>
<xs
equence>
<xs:element name="ST">
<xs:complexType>
<xs
equence>
<xs:element name="ST01" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="BSN">
<xs:complexType>
<xs
equence>
<xs:element name="BSN01" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="DTM">
<xs:complexType>
<xs
equence>
<xs:element name="DTM01" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="1" maxOccurs="200000" name="HLLoop1">
<xs:complexType>
<xs
equence>
<xs:element name="HL">
<xs:complexType>
<xs
equence>
<xs:element name="HL1" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="LIN">
<xs:complexType>
<xs
equence>
<xs:element name="LIN1" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="PRF">
<xs:complexType>
<xs
equence>
<xs:element name="PRF1" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="DTM_2">
<xs:complexType>
<xs
equence>
<xs:element name="DTM01" type="xs
tring" />
</xs
equence>
</xs:complexType>
</xs:element>
</xs
equence>
</xs:complexType>
</xs:element>
<xs:element name="SE">
<xs:complexType />
</xs:element>
</xs
equence>
</xs:complexType>
</xs:element>
</xs
chema>What I need to do is something like
BiffLagonkowitz pointed, a map like the following:SrcSchema.Header.Name -> DestSchema.BSN.BSN01
SrcSchema.Header.ShippingDate-> DestSchema.DTM.DTM01
SrcSchema.Header.PODate-> DestSchema.HLLoop1[1].DTM_2.DTM01
SrcSchema.Header.PONum-> DestSchema.HLLoop1[2].PRF.PRF01
SrcSchema.Items[1].Code-> DestSchema.HLLoop1[3].LIN.LIN01
SrcSchema.Items[1].Size-> DestSchema.HLLoop1[3].LIN.LIN02
SrcSchema.Header.ShippingNum-> DestSchema.HLLoop1[3].LIN.LIN03
SrcSchema.Items[1].Color-> DestSchema.HLLoop1[3].LIN.LIN04
SrcSchema.Items[2].Code-> DestSchema.HLLoop1[4].LIN.LIN01
SrcSchema.Items[2].Size-> DestSchema.HLLoop1[4].LIN.LIN02
SrcSchema.Header.ShippingNum-> DestSchema.HLLoop1[4].LIN.LIN03
SrcSchema.Items[2].Color-> DestSchema.HLLoop1[4].LIN.LIN04
.... and so on...
I appreciate your input on this matter!
Thanks a lot!
- I have a solution. It is just a matter of if you like it or not. Please check out my blog post at http://benrunchey.wordpress.com/2008/02/19/some-xslt-for-when-you-just-cant-get-the-mapper-to-do-what-you-want-it-to-do/
-Biff
- Please ignore my previous post. I found a much better solution and you can read about it in my follow up blog post http://benrunchey.wordpress.com/2008/02/19/finding-out-the-mapper-can-do-what-i-want-it-to-do/
I much prefer this solution to my previous one!
- From my experience those tricks with BizTalk Mapper are not working stable on the different schemas. They are just the tricks and nobody knows how mapper create the real Xslt from them.I prefer using the raw Xslt code in the Script functoids. At last you know how it works and how you can influence it.But it is just my opinion

Thanks to you and everybody that posted, your input is really valuable.
Leonid, could you provide some sample for my reference?
Thanks a lot!
Miguel
- Code Snippet<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='G'">
<Value>
<xsl:value-of select="$var:Measurement_value" />
</Value>
</xsl:if>
</xsl:if>
</xsl:for-each><Unit>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='G'">
<xsl:value-of select="$var:unit_qualifier" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</Unit>
</Weight><Volume>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='AAW'">
<Value>
<xsl:value-of select="$var:Measurement_value" />
</Value>
</xsl:if>
</xsl:if>
</xsl:for-each><Unit>
<xsl:for-each select="ns0:MEA_Measurements_S43">
<xsl:variable name="var:Measurment_qualifier" select="ns0:_6311_Measurement_application_qualifier_E1/text()" />
<xsl:variable name="var:Measurement_dimension" select="ns0:_6313_Measurement_dimension__coded_E2_COMP/ns0:_6313_Measurement_dimension__coded_E2/text()" />
<xsl:variable name="var:Measurement_value" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6314_Measurement_value_E7/text()" />
<xsl:variable name="var:unit_qualifier" select="ns0:_6411_Measure_unit_qualifier_E6_COMP/ns0:_6411_Measure_unit_qualifier_E6/text()" />
<xsl:if test="$var:Measurment_qualifier='AAE'">
<xsl:if test="$var:Measurement_dimension='AAW'">
<xsl:value-of select="$var:unit_qualifier" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</Unit>For example, It is a code for mapping the EDIFACT_CUSCAR_D_95B schema.

