Mike Dole
Mike Dole

Reputation: 687

XSL to Filter out elements without a correct 'qualifier'

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

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167716

To me it sounds as if you want e.g. <xsl:template match="E1EDL20[not(E1ADRM1/PARTNER_Q = 'AG')]"/>

Upvotes: 1

Related Questions