如何根据XML树中某些嵌套元素的特定值完全删除父元素?

时间:2018-10-26 00:05:07

标签: xml xslt xpath

我带着一些复杂的XML,在其中我努力地有条件地从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/>

XML有点长。我想将包含ORU_R01.OBXNTE的所有OBX/OBX.3/CE.3/删除为PIT。请注意,ORU_R01.OBXNTE是文档中的重复元素。 我用身份转换尝试了几件事,但是没有运气。

1 个答案:

答案 0 :(得分:2)

尝试一下: 输入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>

输出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>