I have the following simplified XML structure:
<?xml version="1.0" encoding="utf-8"?>
<list>
<INVOIC>
<M_INVOIC>
<G_SG25>
<S_LIN>
<id>LIN</id>
<D_1082>1</D_1082>
<C_C212>
<D_7140>7610400271943</D_7140>
<D_7143_3>EN</D_7143_3>
</C_C212>
</S_LIN>
</G_SG25>
<G_SG25>
<S_LIN>
<id>LIN</id>
<D_1082>2</D_1082>
<C_C212>
<D_7140>1234567890123</D_7140>
<D_7143_3>EN</D_7143_3>
</C_C212>
</S_LIN>
</G_SG25>
</M_INVOIC>
</INVOIC>
<INVOIC>
<SALESORDER>
<ET_VBAP>
<item>
<VBELN>0010002695</VBELN>
<POSNR>000010</POSNR>
<MATNR>000000000000400487</MATNR>
<EAN11>1234567890123</EAN11>
</item>
<item>
<VBELN>0010002695</VBELN>
<POSNR>000020</POSNR>
<MATNR>000000000000002054</MATNR>
<EAN11>5012454920549</EAN11>
</item>
<item>
<VBELN>0010002695</VBELN>
<POSNR>000030</POSNR>
<MATNR>000000000000392104</MATNR>
<EAN11>3046920921046</EAN11>
</item>
<item>
<VBELN>0010002695</VBELN>
<POSNR>000040</POSNR>
<MATNR>000000000000859146</MATNR>
<EAN11>8003340591469</EAN11>
</item>
<item>
<VBELN>0010002695</VBELN>
<POSNR>000050</POSNR>
<MATNR>000000000000727194</MATNR>
<EAN11>7610400271943</EAN11>
</item>
</ET_VBAP>
</SALESORDER>
</INVOIC>
</list>
my XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="kByEanPos" match="G_SG25" use="S_LIN/C_C212/D_7140"/>
<xsl:template match="/">
<xsl:variable name="uniqueSet" select="G_SG25[generate-id()=generate-id(key('kByEanPos',S_LIN/C_C212/D_7140))]"/>
<list>
<xsl:for-each select="list/INVOIC/M_INVOIC/G_SG25[generate-id()=
generate-id(key('kByEanPos',S_LIN/C_C212/D_7140))]">
<ean>
<xsl:value-of select="parent::M_INVOIC/parent::INVOIC/parent::list/INVOIC/SALESORDER/ET_VBAP/item/MATNR"/>
</ean>
</xsl:for-each>
</list>
</xsl:template>
</xsl:stylesheet>
gives me this XML output:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<ean>000000000000400487</ean>
<ean>000000000000400487</ean>
</list>
But my expected XML output is:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<ean>000000000000727194</ean>
<ean>000000000000400487</ean>
</list>
I am not sure of what I am doing wrong, I can't find my mistake. I think it has to do with the key that I defined.
Basically I need a key on <D_7140>
and then look for that number in the structure below in EAN11
and output the MATNR
right before.
If you are trying to look up item elements based on their EAN11 value, it might be worth considering using a key to do this too
<xsl:key name="item" match="item" use="EAN11" />
That way, you can reduce your xsl:value-of to just this
<xsl:value-of select="key('item', S_LIN/C_C212/D_7140)/MATNR"/>