Click to See Complete Forum and Search --> : Data mapping (xml-to-xml) using with Mapforce


ashok123
November 26th, 2004, 06:04 AM
I am using MapForce data mapping tool.

i have below XML data as Source which is having duplicate elements like code, name:

<?xml version="1.0" encoding="UTF-8"?>

<CustomerDetails xmlns="http://www.tdxgroup.com/namespace"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.tdxgroup.com/namespace:\TDX\mapforce\example2\Customer1.xsd">



<Customer>

<Code>C001</Code>

<Name>Cust1</Name>

<Phone>88888888</Phone>

</Customer>



<Customer>

<Code>C001</Code>

<Name>Cus1</Name>

<Phone>77777777</Phone>

</Customer>



<Customer>

<Code>C001</Code>

<Name>Cust1</Name>

<Phone>66666666</Phone>

</Customer>



<Customer>

<Code>C002</Code>

<Name>Cust2</Name>

<Phone>55555555</Phone>

</Customer>


<Customer>

<Code>C003</Code>

<Name>Cust3</Name>
<Phone>55555555</Phone>
</Customer>

</CustomerDetails>

This dupication need to be remove from source to target xml as given below Target xml data:

<CustomerDetails xmlns="http://tdxgroup.com/namespace"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://tdxgroup.com/namespace:\TDX\mapforce\example2\Customer2.xsd">



<Customer>

<Code>C001</Code>

<Name>Cust1</Name>

<Phones>
<Phone>88888888</Phone>

<Phone>77777777</Phone>

<Phone>66666666</Phone>

</Phones>

</Customer>

<Customer>
<Code>C002</Code>

<Name>Cust2</Name>
<Phones>
<Phone>11111111</Phone>
</Phones>

</Customer>

</CustomerDetails>

Is this possible through MapForce tool, if yes then please provide solution on this problem.

For your reference please find the attachment.


Thanks in adavance.



Regards

AK

khp
November 26th, 2004, 09:20 AM
This seems very simmilar to your other post http://www.codeguru.com/forum/showthread.php?t=319622

No need to post the same question twice.

jkmyoung
November 26th, 2004, 12:30 PM
? No, this is a different question altogether. You'd have to solve this one to use the answer to the next one...

I don't believe this is achievable with mapforce (not simply anyways.) I recommend using the Muenchian grouping method. http://www.jenitennison.com/xslt/grouping/muenchian.html
...
<xsl:key name="customer-by-code" match="Customer" use="Code" />
..
<xsl:for-each select="Customer[count(. | key('customer-by-code', Code)[1]) = 1]">
<xsl:copy-of select="Code"/>
<xsl:copy-of select="Name"/>
<Phones>
<xsl:for-each select="key('customer-by-code', Code)">
<xsl:copy-of select="Phone"/>

ashok123
November 29th, 2004, 07:35 AM
Hi khp,

This is different query but all together, i am desperately looking help for this.

jkmyoung : Thanks for your quick reponse.

you are right you understood what i need, i didn't understand your code could you kindly explain with more details with any example.

I want to get this only using with mapforce.

If somebody knows solution about this, please post as early as possible.

Thanks in advance

Regards
Ashok

jkmyoung
November 29th, 2004, 05:14 PM
I would have suggested posting on the Altova forums, but I see you've already done that... There are 2 major problems here:
1. Finding the unique names (or Codes).
2. Finding the Person elements with this name.

I can't see a way to do this without using a custom xslt library function. Tools - Options - Libraries - Add - (xslt file)

Put this in the xslt file you're adding.
<xsl:template name="firstPerson">
<!-- returns true if this is the first person with this name -->
<xsl:param name="Person"/>
<xsl:for-each select="$Person">
<xsl:choose>
<xsl:when test="not(preceding-sibling::Person[Name=$Person/Name])">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

Use this as a filter condition, as to whether you want a new result person or not.
Can't think of how to do the 2nd part in mapforce... Really, using a custom XSLT sheet for this one transformation is the way to go, but then you'd have to learn xslt. Maybe someone else has a better idea.