Reputation: 687
It's me (again). I fail to filter an IDOC / xml where the E1EDL20 elements have E1ADRM1 elements without an AG PARTNER_Q. In other words I only want E1EDl20 nodes when there exists a E1ADRM\PARTNER_Q='AG'
Source XML:
<?xml version="1.0" encoding="UTF-8"?>
<SHPMNT05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
<MANDT>100</MANDT>
</EDI_DC40>
<E1EDT20 SEGMENT="1">
<TKNUM>0000252060</TKNUM>
<E1EDK33 SEGMENT="1">
<TSNUM>0001</TSNUM>
</E1EDK33>
<E1EDL20 SEGMENT="1">
<VBELN>0081971127</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>SP</PARTNER_Q>
<PARTNER_ID>0000005682</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>WE</PARTNER_Q>
<PARTNER_ID>0000012417</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSP</PARTNER_Q>
<PARTNER_ID>EWM</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSO</PARTNER_Q>
<PARTNER_ID>0200</PARTNER_ID>
</E1ADRM1>
<E1EDL24 SEGMENT="1">
<POSNR>000010</POSNR>
<MATNR>123</MATNR>
</E1EDL24>
</E1EDL20>
<E1EDL20 SEGMENT="1">
<VBELN>0081971128</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>AG</PARTNER_Q>
<PARTNER_ID>0000003884</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>RE</PARTNER_Q>
<PARTNER_ID>0000004105</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>WE</PARTNER_Q>
<PARTNER_ID>0000012417</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSP</PARTNER_Q>
<PARTNER_ID>EWM</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSO</PARTNER_Q>
<PARTNER_ID>0200</PARTNER_ID>
</E1ADRM1>
<E1EDL24 SEGMENT="1">
<POSNR>000010</POSNR>
<MATNR>123</MATNR>
</E1EDL24>
</E1EDL20>
</E1EDT20>
</IDOC>
</SHPMNT05>
Required result only 'output' when partner_q = AG:
<?xml version="1.0" encoding="UTF-8"?>
<SHPMNT05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
<MANDT>100</MANDT>
</EDI_DC40>
<E1EDT20 SEGMENT="1">
<TKNUM>0000252060</TKNUM>
<E1EDK33 SEGMENT="1">
<TSNUM>0001</TSNUM>
</E1EDK33>
<E1EDL20 SEGMENT="1">
<VBELN>0081971128</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>AG</PARTNER_Q>
<PARTNER_ID>0000003884</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>RE</PARTNER_Q>
<PARTNER_ID>0000004105</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>WE</PARTNER_Q>
<PARTNER_ID>0000012417</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSP</PARTNER_Q>
<PARTNER_ID>EWM</PARTNER_ID>
</E1ADRM1>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>OSO</PARTNER_Q>
<PARTNER_ID>0200</PARTNER_ID>
</E1ADRM1>
<E1EDL24 SEGMENT="1">
<POSNR>000010</POSNR>
<MATNR>123</MATNR>
</E1EDL24>
</E1EDL20>
</E1EDT20>
</IDOC>
</SHPMNT05>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" omit-xml-declaration="yes" />
<!-- identity template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- override the above template for certain E1EDL20 elements; output nothing. -->
<xsl:template match="/*[//IDOC/SHPMNT05/E1EDL20[E1ADRM1[
not(PARTNER_Q = 'AG')]]]">
</xsl:template>
</xsl:stylesheet>
My xsl doesn't filter / is incorrect.
Kind regards,
Mike
Upvotes: 0
Views: 81
Reputation: 167716
To me it sounds as if you want e.g. <xsl:template match="E1EDL20[not(E1ADRM1/PARTNER_Q = 'AG')]"/>
Upvotes: 1