How to completely remove parent element based on certain value of some nested element in the XML tree?

Viewed 67

I've a little complicated XML with me where in I'm struggling to remove certain elements from XML conditionally.

<hl7:message xmlns:hl7="http://wso2.org/hl7"><ORU_R01 xmlns="urn:hl7-org:v2xml">
<ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
    <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
            <OBX>
                <OBX.1>1</OBX.1>
                <OBX.16>
                    <XCN.1>i_tsleo</XCN.1>
                </OBX.16>
            </OBX>
            <NTE/>
        </ORU_R01.OBXNTE>
        <ORU_R01.OBXNTE>
            <OBX>
                <OBX.1>2</OBX.1>
                <OBX.2>FT</OBX.2>
                <OBX.3>
                    <CE.3>PIT</CE.3>
                </OBX.3>
            </OBX>
            <NTE/>
        </ORU_R01.OBXNTE>
        <CTI/>
    </ORU_R01.ORCOBRNTEOBXNTECTI>
    <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
            <OBX>
                <OBX.1>1</OBX.1>
                <OBX.2>NM</OBX.2>
                <OBX.16>
                    <XCN.1>i_tsleo</XCN.1>
                </OBX.16>
            </OBX>
            <NTE/>
        </ORU_R01.OBXNTE>
        <ORU_R01.OBXNTE>
            <OBX>
                <OBX.1>9</OBX.1>
                <OBX.2>FT</OBX.2>
                <OBX.3>
                    <CE.3>PIT</CE.3>
                </OBX.3>
            </OBX>
        </ORU_R01.OBXNTE>
        <CTI/>
    </ORU_R01.ORCOBRNTEOBXNTECTI>
    <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
            <OBX>
                <OBX.1>8</OBX.1>
                <OBX.2>FT</OBX.2>
                <OBX.3>
                    <CE.3>PIT</CE.3>
                </OBX.3>
            </OBX>
            <NTE/>
        </ORU_R01.OBXNTE>
        <CTI/>
    </ORU_R01.ORCOBRNTEOBXNTECTI>
</ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
<DSC/>

A bit long XML. I want to remove all ORU_R01.OBXNTE containing OBX/OBX.3/CE.3/ to be PIT. Note that the ORU_R01.OBXNTE is a repeating element in the document. I tried few things with identity transform, however no luck.

1 Answers

Try this: Input XML:

<hl7:message xmlns:hl7="http://wso2.org/hl7">
  <ORU_R01 xmlns="urn:hl7-org:v2xml">
    <ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>1</OBX.1>
            <OBX.16>
              <XCN.1>i_tsleo</XCN.1>
            </OBX.16>
          </OBX>
          <NTE/>
        </ORU_R01.OBXNTE>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>2</OBX.1>
            <OBX.2>FT</OBX.2>
            <OBX.3>
              <CE.3>PIT</CE.3>
            </OBX.3>
          </OBX>
          <NTE/>
        </ORU_R01.OBXNTE>
        <CTI/>
      </ORU_R01.ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>1</OBX.1>
            <OBX.2>NM</OBX.2>
            <OBX.16>
              <XCN.1>i_tsleo</XCN.1>
            </OBX.16>
          </OBX>
          <NTE/>
        </ORU_R01.OBXNTE>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>9</OBX.1>
            <OBX.2>FT</OBX.2>
            <OBX.3>
              <CE.3>PIT</CE.3>
            </OBX.3>
          </OBX>
        </ORU_R01.OBXNTE>
        <CTI/>
      </ORU_R01.ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>8</OBX.1>
            <OBX.2>FT</OBX.2>
            <OBX.3>
              <CE.3>PIT</CE.3>
            </OBX.3>
          </OBX>
          <NTE/>
        </ORU_R01.OBXNTE>
        <CTI/>
      </ORU_R01.ORCOBRNTEOBXNTECTI>
    </ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
    <DSC/>
  </ORU_R01>
</hl7:message>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="urn:hl7-org:v2xml">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="x:ORU_R01.OBXNTE[.//x:CE.3 = 'PIT']"/>
</xsl:stylesheet>

Output XML:

<?xml version="1.0" encoding="utf-8"?>
<hl7:message xmlns:hl7="http://wso2.org/hl7">
  <ORU_R01 xmlns="urn:hl7-org:v2xml">
    <ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>1</OBX.1>
            <OBX.16>
              <XCN.1>i_tsleo</XCN.1>
            </OBX.16>
          </OBX>
          <NTE />
        </ORU_R01.OBXNTE>

        <CTI />
      </ORU_R01.ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>
        <ORU_R01.OBXNTE>
          <OBX>
            <OBX.1>1</OBX.1>
            <OBX.2>NM</OBX.2>
            <OBX.16>
              <XCN.1>i_tsleo</XCN.1>
            </OBX.16>
          </OBX>
          <NTE />
        </ORU_R01.OBXNTE>

        <CTI />
      </ORU_R01.ORCOBRNTEOBXNTECTI>
      <ORU_R01.ORCOBRNTEOBXNTECTI>

        <CTI />
      </ORU_R01.ORCOBRNTEOBXNTECTI>
    </ORU_R01.PIDPD1NK1NTEPV1PV2ORCOBRNTEOBXNTECTI>
    <DSC />
  </ORU_R01>
</hl7:message>
Related