xslt-2.0

XSLT filtering template


I have the input xml:

<PerNationalId>
    <PerNationalId>
      <nationalId>999.999.868-88</nationalId>
      <personNav>
        <PerPerson>
          <employmentNav>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>27122165960</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>6</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit>      
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>T</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>60020077</userId>
            </EmpEmployment>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>320008725351</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>3</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit> 
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>A</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>20028939</userId>
            </EmpEmployment>
          </employmentNav>
        </PerPerson>
      </personNav>
    </PerNationalId>
  </PerNationalId>

And I need the following output:

<PerNationalId>
    <PerNationalId>
      <nationalId>999.999.868-88</nationalId>
      <personNav>
        <PerPerson>
          <employmentNav>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>320008725351</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>3</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit> 
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>A</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>20028939</userId>
            </EmpEmployment>
          </employmentNav>
        </PerPerson>
      </personNav>
    </PerNationalId>
  </PerNationalId>

Basically I need to remove the node EmpEmployment when sub node inside it /jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode has the value equal to T.

Could you please help me?

Thanks.

I have tried the following XSLT, but it's removing only the emplStatusNav tag

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="/PerNationalId/PerNationalId/personNav/PerPerson/employmentNav/EmpEmployment/jobInfoNav/EmpJob/emplStatusNav/PicklistOption[(externalCode= 'T')]"/>
</xsl:stylesheet>

Solution

  • XSLT 3 (fiddle online):

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="3.0"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      exclude-result-prefixes="#all">
    
      <xsl:mode on-no-match="shallow-copy"/>
      
      <xsl:template match="EmpEmployment[jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode = 'T']"/>
    
    </xsl:stylesheet>
    

    XSLT 2 (fiddle online):

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="2.0"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      exclude-result-prefixes="#all">
    
      <xsl:template match="@* | node() | document-node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
      
      <xsl:template match="EmpEmployment[jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode = 'T']"/>
    
    </xsl:stylesheet>