BizTalk Server General - Custom XSLT map problem

This is Interesting: Free IT Magazines  
Home > Archive > BizTalk Server General > December 2004 > Custom XSLT map problem





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author Custom XSLT map problem
Kim Bergstr?m

2004-12-01, 5:51 pm

Hello,

I'm new to Biztalk Server 2004 and I'm trying to migrate a number of
mappings from Biztalk 2002 to 2004. Some of these use custom XSLT and
I can't really get these to work in 2004. Below is an example from one
XSLT where I try to map some data from an SAP ORDERS IDOC to another
xml format.

<?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" version="1.0">
<xsl:output omit-xml-declaration="yes" version="1.0" method="xml" />
<xsl:template match="/">
<xsl:apply-templates select="/*[local-name()='ORDERS05' and
namespace-uri()='']" />
</xsl:template>
<xsl:template match="/*[local-name()='ORDERS05' and
namespace-uri()='']">
<AVOMBOKATRANSPORT>
<IDENTIFIERARE>
<xsl:value-of select="string(/*[local-name()='ORDERS05'and
namespace-uri()='']/*[local-name()='E2EDK01005' and
namespace-uri()='']/@*[local-name()='BELNR' and
namespace-uri()=''])"/>
<!-- <xsl:value-of select="userCSharp:GetVariable( 'USERID' )"/>
-->
</IDENTIFIERARE>
<HUVUDTERMER>
<ORDERNR>
<xsl:value-of select="string(/*[local-name()='ORDERS05' and
namespace-uri()='']/*[local-name()='E2EDK01005' and
namespace-uri()='']/@*[local-name()='BELNR' and
namespace-uri()=''])"/>
</ORDERNR>
<USERID>
USERID
</USERID>
<TIDPUNKT>
TID
</TIDPUNKT>
</HUVUDTERMER>
<!-- Logic to populate Termer -->
<xsl:for-each select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']">
<xsl:for-each select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']/*[local-name()='E2EDP01006']">
<TERMER>
<PARTNERDATA>
<PDATATYP></PDATATYP>
<KUNDNR></KUNDNR>
<KUNDNAMN></KUNDNAMN>
<KUNDNAMNK></KUNDNAMNK>
<MAILADDR></MAILADDR>
<FAXADDR></FAXADDR>
<TELNR></TELNR>
</PARTNERDATA>
<BESTNR>BESTNR</BESTNR>
<KOD>KOD</KOD>
<ORSAK></ORSAK>
<LASTDAT></LASTDAT>
<LASTTID></LASTTID>
<FRAMDAT></FRAMDAT>
<FRAMTID></FRAMTID>
</TERMER>
</xsl:for-each> </xsl:for-each>
<FEL>
<FELNR>MQ</FELNR>
<FELMED>BTALKREPLY</FELMED>
</FEL>
</AVOMBOKATRANSPORT>
</xsl:template>
</xsl:stylesheet>

The map runs ok but the data in the output is not what I expect. That
is, the "xsl:value-of" calls don't return the content of the xml
elements/attributes but its name (?) followed by a number.

Output:

<AVOMBOKATRANSPORT>
<IDENTIFIERARE>BELNR_15</IDENTIFIERARE>
<HUVUDTERMER>
<ORDERNR>BELNR_15</ORDERNR>
<USERID>USERID</USERID>
<TIDPUNKT>TID</TIDPUNKT>
</HUVUDTERMER>
<TERMER>
<PARTNERDATA>
<PDATATYP />
<KUNDNR />
<KUNDNAMN />
<KUNDNAMNK />
<MAILADDR />
<FAXADDR />
<TELNR />
</PARTNERDATA>
<BESTNR>BESTNR</BESTNR>
<KOD>KOD</KOD>
<ORSAK />
<LASTDAT />
<LASTTID />
<FRAMDAT />
<FRAMTID />
</TERMER>
<TERMER>
<PARTNERDATA>
<PDATATYP />
<KUNDNR />
<KUNDNAMN />
<KUNDNAMNK />
<MAILADDR />
<FAXADDR />
<TELNR />
</PARTNERDATA>
<BESTNR>BESTNR</BESTNR>
<KOD>KOD</KOD>
<ORSAK />
<LASTDAT />
<LASTTID />
<FRAMDAT />
<FRAMTID />
</TERMER>
<FEL>
<FELNR>MQ</FELNR>
<FELMED>BTALKREPLY</FELMED>
</FEL>
</AVOMBOKATRANSPORT>

The //AVOMBOKATRANSPORT/IDENTIFIERARE element and
//AVOMBOKATRANSPORT/HUVUDTERMER/ORDERNR should contain the value
"0010000372". See start of input file below.

<ORDERS05>
<EDI_DC40 TABNAM="EDI_DC40" MANDT="800" DOCNUM="0000000000034886"
DOCREL="46B" STATUS="30" DIRECT="1" OUTMOD="2" IDOCTYP="ORDERS05"
MESTYP="ZSDORDER" MESCOD="B02" STDMES="ZSDORD" SNDPOR="SAPDE2"
SNDPRT="LS" SNDPRN="DE2ALE800" RCVPOR="A000000001" RCVPRT="LS"
RCVPFC="LS" RCVPRN="BIZTALK" CREDAT="20040426" CRETIM="135049"
SERIAL="20040423101929" />
<E2EDK01005 SEGNAM="E2EDK01005" MANDT="800"
DOCNUM="0000000000034886" SEGNUM="000001" PSGNUM="0" HLEVEL="01"
ACTION="000" CURCY="SEK" WKURS="1.00000" ZTERM="KF10"
BELNR="0010000372" RECIPNT_NO="0000040031" />

What am I doing wrong?

Thanks,
Kim
Greg Forsythe

2004-12-01, 5:51 pm

Get rid of the string function:

<xsl:value-of select="/*[local-name()='ORDERS05'and
namespace-uri()='']/*[local-name()='E2EDK01005' and
namespace-uri()='']/@*[local-name()='BELNR' and
namespace-uri()='']"/>

<xsl:value-of select="/*[local-name()='ORDERS05' and
namespace-uri()='']/*[local-name()='E2EDK01005' and
namespace-uri()='']/@*[local-name()='BELNR' and
namespace-uri()='']"/>

Greg

"Kim Bergstr?m" <kim.bergstrom@capgemini.com> wrote in message
news:3bb5be12.0412010837.43233795@posting.google.com...
> Hello,
>
> I'm new to Biztalk Server 2004 and I'm trying to migrate a number of
> mappings from Biztalk 2002 to 2004. Some of these use custom XSLT and
> I can't really get these to work in 2004. Below is an example from one
> XSLT where I try to map some data from an SAP ORDERS IDOC to another
> xml format.
>
> <?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" version="1.0">
> <xsl:output omit-xml-declaration="yes" version="1.0" method="xml" />
> <xsl:template match="/">
> <xsl:apply-templates select="/*[local-name()='ORDERS05' and
> namespace-uri()='']" />
> </xsl:template>
> <xsl:template match="/*[local-name()='ORDERS05' and
> namespace-uri()='']">
> <AVOMBOKATRANSPORT>
> <IDENTIFIERARE>
> <xsl:value-of select="string(/*[local-name()='ORDERS05'and
> namespace-uri()='']/*[local-name()='E2EDK01005' and
> namespace-uri()='']/@*[local-name()='BELNR' and
> namespace-uri()=''])"/>
> <!-- <xsl:value-of select="userCSharp:GetVariable( 'USERID' )"/>
> -->
> </IDENTIFIERARE>
> <HUVUDTERMER>
> <ORDERNR>
> <xsl:value-of select="string(/*[local-name()='ORDERS05' and
> namespace-uri()='']/*[local-name()='E2EDK01005' and
> namespace-uri()='']/@*[local-name()='BELNR' and
> namespace-uri()=''])"/>
> </ORDERNR>
> <USERID>
> USERID
> </USERID>
> <TIDPUNKT>
> TID
> </TIDPUNKT>
> </HUVUDTERMER>
> <!-- Logic to populate Termer -->
> <xsl:for-each

select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']">
> <xsl:for-each

select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']/*[local-
name()='E2EDP01006']">
> <TERMER>
> <PARTNERDATA>
> <PDATATYP></PDATATYP>
> <KUNDNR></KUNDNR>
> <KUNDNAMN></KUNDNAMN>
> <KUNDNAMNK></KUNDNAMNK>
> <MAILADDR></MAILADDR>
> <FAXADDR></FAXADDR>
> <TELNR></TELNR>
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK></ORSAK>
> <LASTDAT></LASTDAT>
> <LASTTID></LASTTID>
> <FRAMDAT></FRAMDAT>
> <FRAMTID></FRAMTID>
> </TERMER>
> </xsl:for-each> </xsl:for-each>
> <FEL>
> <FELNR>MQ</FELNR>
> <FELMED>BTALKREPLY</FELMED>
> </FEL>
> </AVOMBOKATRANSPORT>
> </xsl:template>
> </xsl:stylesheet>
>
> The map runs ok but the data in the output is not what I expect. That
> is, the "xsl:value-of" calls don't return the content of the xml
> elements/attributes but its name (?) followed by a number.
>
> Output:
>
> <AVOMBOKATRANSPORT>
> <IDENTIFIERARE>BELNR_15</IDENTIFIERARE>
> <HUVUDTERMER>
> <ORDERNR>BELNR_15</ORDERNR>
> <USERID>USERID</USERID>
> <TIDPUNKT>TID</TIDPUNKT>
> </HUVUDTERMER>
> <TERMER>
> <PARTNERDATA>
> <PDATATYP />
> <KUNDNR />
> <KUNDNAMN />
> <KUNDNAMNK />
> <MAILADDR />
> <FAXADDR />
> <TELNR />
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK />
> <LASTDAT />
> <LASTTID />
> <FRAMDAT />
> <FRAMTID />
> </TERMER>
> <TERMER>
> <PARTNERDATA>
> <PDATATYP />
> <KUNDNR />
> <KUNDNAMN />
> <KUNDNAMNK />
> <MAILADDR />
> <FAXADDR />
> <TELNR />
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK />
> <LASTDAT />
> <LASTTID />
> <FRAMDAT />
> <FRAMTID />
> </TERMER>
> <FEL>
> <FELNR>MQ</FELNR>
> <FELMED>BTALKREPLY</FELMED>
> </FEL>
> </AVOMBOKATRANSPORT>
>
> The //AVOMBOKATRANSPORT/IDENTIFIERARE element and
> //AVOMBOKATRANSPORT/HUVUDTERMER/ORDERNR should contain the value
> "0010000372". See start of input file below.
>
> <ORDERS05>
> <EDI_DC40 TABNAM="EDI_DC40" MANDT="800" DOCNUM="0000000000034886"
> DOCREL="46B" STATUS="30" DIRECT="1" OUTMOD="2" IDOCTYP="ORDERS05"
> MESTYP="ZSDORDER" MESCOD="B02" STDMES="ZSDORD" SNDPOR="SAPDE2"
> SNDPRT="LS" SNDPRN="DE2ALE800" RCVPOR="A000000001" RCVPRT="LS"
> RCVPFC="LS" RCVPRN="BIZTALK" CREDAT="20040426" CRETIM="135049"
> SERIAL="20040423101929" />
> <E2EDK01005 SEGNAM="E2EDK01005" MANDT="800"
> DOCNUM="0000000000034886" SEGNUM="000001" PSGNUM="0" HLEVEL="01"
> ACTION="000" CURCY="SEK" WKURS="1.00000" ZTERM="KF10"
> BELNR="0010000372" RECIPNT_NO="0000040031" />
>
> What am I doing wrong?
>
> Thanks,
> Kim



Greg Forsythe

2004-12-05, 5:50 pm

Kim,
The string function is not the problem. I managed to get it to work with and
without the string function.

When you test your map you need to specify the correct input file instance
and input type. You need to set the Testmap Input parameter to Xml. The
default is Generated Instance, which generates the Xml input file (containing
BELNR_15) and ignores you input file instance.


Greg

"Kim Bergstr?m" wrote:

> Hello,
>
> I'm new to Biztalk Server 2004 and I'm trying to migrate a number of
> mappings from Biztalk 2002 to 2004. Some of these use custom XSLT and
> I can't really get these to work in 2004. Below is an example from one
> XSLT where I try to map some data from an SAP ORDERS IDOC to another
> xml format.
>
> <?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" version="1.0">
> <xsl:output omit-xml-declaration="yes" version="1.0" method="xml" />
> <xsl:template match="/">
> <xsl:apply-templates select="/*[local-name()='ORDERS05' and
> namespace-uri()='']" />
> </xsl:template>
> <xsl:template match="/*[local-name()='ORDERS05' and
> namespace-uri()='']">
> <AVOMBOKATRANSPORT>
> <IDENTIFIERARE>
> <xsl:value-of select="string(/*[local-name()='ORDERS05'and
> namespace-uri()='']/*[local-name()='E2EDK01005' and
> namespace-uri()='']/@*[local-name()='BELNR' and
> namespace-uri()=''])"/>
> <!-- <xsl:value-of select="userCSharp:GetVariable( 'USERID' )"/>
> -->
> </IDENTIFIERARE>
> <HUVUDTERMER>
> <ORDERNR>
> <xsl:value-of select="string(/*[local-name()='ORDERS05' and
> namespace-uri()='']/*[local-name()='E2EDK01005' and
> namespace-uri()='']/@*[local-name()='BELNR' and
> namespace-uri()=''])"/>
> </ORDERNR>
> <USERID>
> USERID
> </USERID>
> <TIDPUNKT>
> TID
> </TIDPUNKT>
> </HUVUDTERMER>
> <!-- Logic to populate Termer -->
> <xsl:for-each select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']">
> <xsl:for-each select="/*[local-name()='ORDERS05']/*[local-name()='E2EDP01006GRP']/*[local-name()='E2EDP01006']">
> <TERMER>
> <PARTNERDATA>
> <PDATATYP></PDATATYP>
> <KUNDNR></KUNDNR>
> <KUNDNAMN></KUNDNAMN>
> <KUNDNAMNK></KUNDNAMNK>
> <MAILADDR></MAILADDR>
> <FAXADDR></FAXADDR>
> <TELNR></TELNR>
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK></ORSAK>
> <LASTDAT></LASTDAT>
> <LASTTID></LASTTID>
> <FRAMDAT></FRAMDAT>
> <FRAMTID></FRAMTID>
> </TERMER>
> </xsl:for-each> </xsl:for-each>
> <FEL>
> <FELNR>MQ</FELNR>
> <FELMED>BTALKREPLY</FELMED>
> </FEL>
> </AVOMBOKATRANSPORT>
> </xsl:template>
> </xsl:stylesheet>
>
> The map runs ok but the data in the output is not what I expect. That
> is, the "xsl:value-of" calls don't return the content of the xml
> elements/attributes but its name (?) followed by a number.
>
> Output:
>
> <AVOMBOKATRANSPORT>
> <IDENTIFIERARE>BELNR_15</IDENTIFIERARE>
> <HUVUDTERMER>
> <ORDERNR>BELNR_15</ORDERNR>
> <USERID>USERID</USERID>
> <TIDPUNKT>TID</TIDPUNKT>
> </HUVUDTERMER>
> <TERMER>
> <PARTNERDATA>
> <PDATATYP />
> <KUNDNR />
> <KUNDNAMN />
> <KUNDNAMNK />
> <MAILADDR />
> <FAXADDR />
> <TELNR />
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK />
> <LASTDAT />
> <LASTTID />
> <FRAMDAT />
> <FRAMTID />
> </TERMER>
> <TERMER>
> <PARTNERDATA>
> <PDATATYP />
> <KUNDNR />
> <KUNDNAMN />
> <KUNDNAMNK />
> <MAILADDR />
> <FAXADDR />
> <TELNR />
> </PARTNERDATA>
> <BESTNR>BESTNR</BESTNR>
> <KOD>KOD</KOD>
> <ORSAK />
> <LASTDAT />
> <LASTTID />
> <FRAMDAT />
> <FRAMTID />
> </TERMER>
> <FEL>
> <FELNR>MQ</FELNR>
> <FELMED>BTALKREPLY</FELMED>
> </FEL>
> </AVOMBOKATRANSPORT>
>
> The //AVOMBOKATRANSPORT/IDENTIFIERARE element and
> //AVOMBOKATRANSPORT/HUVUDTERMER/ORDERNR should contain the value
> "0010000372". See start of input file below.
>
> <ORDERS05>
> <EDI_DC40 TABNAM="EDI_DC40" MANDT="800" DOCNUM="0000000000034886"
> DOCREL="46B" STATUS="30" DIRECT="1" OUTMOD="2" IDOCTYP="ORDERS05"
> MESTYP="ZSDORDER" MESCOD="B02" STDMES="ZSDORD" SNDPOR="SAPDE2"
> SNDPRT="LS" SNDPRN="DE2ALE800" RCVPOR="A000000001" RCVPRT="LS"
> RCVPFC="LS" RCVPRN="BIZTALK" CREDAT="20040426" CRETIM="135049"
> SERIAL="20040423101929" />
> <E2EDK01005 SEGNAM="E2EDK01005" MANDT="800"
> DOCNUM="0000000000034886" SEGNUM="000001" PSGNUM="0" HLEVEL="01"
> ACTION="000" CURCY="SEK" WKURS="1.00000" ZTERM="KF10"
> BELNR="0010000372" RECIPNT_NO="0000040031" />
>
> What am I doing wrong?
>
> Thanks,
> Kim
>

Sponsored Links






Free braindumps | Software forum | Database administration forum

Copyright 2003 - 2008 webservertalk.com