MartinKahn
MartinKahn

Reputation: 137

XSLT removing nodes not matching a attribute value

I am trying to remove nodes from an xml if certain attribute values are not matching. Here is my XML:

<CONFIGURATIONS>
<CONFIG1 DOMAIN="CAE" FOCUS="IN" STATUS="ACTIVE" >
    <ATTR>1<ATTR>
</CONFIG1>
<CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="INACTIVE" >
    <ATTR>2<ATTR>
</CONFIG1>
    <CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="ACTIVE" >
    <ATTR>2<ATTR>
</CONFIG1>
    <CONFIG1 DOMAIN="MFG" FOCUS="OUT" STATUS="ACTIVE" >
    <ATTR>3<ATTR>
</CONFIG1>
</CONFIGURATIONS>

I want to remove the nodes not do not have the DOMAIN value as CAE and the FOCUS is not OUT and the STATUS is not ACTIVE.

<CONFIGURATIONS>    
    <CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="ACTIVE" >
    <ATTR>2<ATTR>
</CONFIG1>  

I am using the following xslt:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="node()|@*">
         <xsl:copy>
              <xsl:apply-templates select="node()|@*"/>
          </xsl:copy>
    </xsl:template>
    <xsl:template match="SM_CONFIG_ITEM [@DOMAIN !='CAE' and @FOCUS !='OUT' and @STATUS != 'INACTIVE']"/>
</xsl:stylesheet>

But it is not producing the desired output. What am I doing wrong?

Upvotes: 1

Views: 4016

Answers (1)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243449

<xsl:template match="SM_CONFIG_ITEM [@DOMAIN !='CAE' and @FOCUS !='OUT' and @STATUS != 'INACTIVE']"/>

But it is not producing the desired output. What am I doing wrong?

You want the element to be matched when one of the != conditions is satisfied -- but the above match pattern specifies that all of the != conditions must be satisfied.

Solution:

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "CONFIG1[not(@DOMAIN='CAE' and @FOCUS='OUT' and @STATUS='ACTIVE')]"/>
</xsl:stylesheet>

when applied on the provided XML document:

<CONFIGURATIONS>
    <CONFIG1 DOMAIN="CAE" FOCUS="IN" STATUS="ACTIVE" >
        <ATTR>1</ATTR>
    </CONFIG1>
    <CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="INACTIVE" >
        <ATTR>2</ATTR>
    </CONFIG1>
    <CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="ACTIVE" >
        <ATTR>2</ATTR>
    </CONFIG1>
    <CONFIG1 DOMAIN="MFG" FOCUS="OUT" STATUS="ACTIVE" >
        <ATTR>3</ATTR>
    </CONFIG1>
</CONFIGURATIONS>

produces the wanted, correct result:

<CONFIGURATIONS>
   <CONFIG1 DOMAIN="CAE" FOCUS="OUT" STATUS="ACTIVE">
      <ATTR>2</ATTR>
   </CONFIG1>
</CONFIGURATIONS>

Upvotes: 1

Related Questions