简体   繁体   English

XSLT转换以搜索和删除

[英]XSLT transform to search and delete

The <P1> tags appear under <web-app> and under <servlet> tags in the XML file. <P1>标记出现在XML文件中的<web-app><servlet>标记下。 I want to search <servlet> tag with <servlet-name> as DUMMY and then delete <P1> tags under it when its sub-tag <p1-name> is equal to B2 OR B3. 我想用<servlet-name>作为DUMMY搜索<servlet>标记,然后在其子标记<p1-name>等于B2或B3时删除其下的<P1>标记。 We DO NOT WANT TO ALTER THE <P1> tags directly uder <web-app> 我们不想直接在<web-app>更改<P1>标签

I have got familiar with identity template and searching but struggling to delete. 我已经熟悉身份模板和搜索,但是却很难删除。 Any solutions so that i can tackle similar problems in future? 任何解决方案,以便我将来可以解决类似的问题?

Input XML 输入XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true">

<P1>IGNORE1</P1>
<P1>IGNORE2</P1>

<servlet>
    <servlet-name>TEST</servlet-name>
        <servlet-class>com.mm.bb.servlet.TEST</servlet-class>
        <P1>
            <p1-name>A1</p1-name>
            <p1-value>A11111</p1-value>
        </P1>
        <P1>
            <p1-name>A2</p1-name>
            <p1-value>A22222</p1-value>
        </P1>
        <P1>
            <p1-name>A3</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>A4</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>A5</p1-name>
                <p1-value/>
        </P1>

      <junk>1</junk>
  </servlet>

<servlet>
    <servlet-name>DUMMY</servlet-name>
        <servlet-class>com.mm.bb.servlet.DUMMY</servlet-class>
        <P1>
            <p1-name>B1</p1-name>
            <p1-value>B11111</p1-value>
        </P1>
        <P1>
            <p1-name>B2</p1-name>
            <p1-value>A22222</p1-value>
        </P1>
        <P1>
            <p1-name>B3</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>B4</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>B5</p1-name>
                <p1-value/>
        </P1>

      <junk>1333</junk>
  </servlet>

<servlet>
    <servlet-name>SAMMY</servlet-name>
        <servlet-class>com.mm.bb.servlet.SAMMY</servlet-class>
        <P1>
            <p1-name>C1</p1-name>
            <p1-value>B11111</p1-value>
        </P1>
        <P1>
            <p1-name>C2</p1-name>
            <p1-value>A22222</p1-value>
        </P1>
        <P1>
            <p1-name>C3</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>C4</p1-name>
                <p1-value/>
        </P1>
        <P1>
            <p1-name>C5</p1-name>
                <p1-value/>
        </P1>

      <junk>12313</junk>
  </servlet>


<D>
        <D1>
            <D11>admin</D11>            
        </D1>
        <D2>
            <D21>XX</D21>
        </D2>
</D>

<E>
     <E1>Yo</E1>
     <E2>Hello</E2>
</E>

</web-app>

The O/P XML should look like this where <P1> tag under <servlet> with <servlet-name> as DUMMY are removed because <p1-name> was either B2 OR B3. O / P XML应该看起来像这样,其中由于<p1-name>是B2或B3,因此删除了<servlet>具有<servlet-name>为DUMMY的<P1>标记。

 <?xml version="1.0" encoding="UTF-8"?>
  <web-app metadata-complete="true">
  <P1>IGNORE1</P1>
  <P1>IGNORE2</P1> 


        <servlet>
        <servlet-name>TEST</servlet-name>
            <servlet-class>com.mm.bb.servlet.TEST</servlet-class>
            <P1>
                <p1-name>A1</p1-name>
                <p1-value>A11111</p1-value>
            </P1>
            <P1>
                <p1-name>A2</p1-name>
                <p1-value>A22222</p1-value>
            </P1>
            <P1>
                <p1-name>A3</p1-name>
                    <p1-value/>
            </P1>
            <P1>
                <p1-name>A4</p1-name>
                    <p1-value/>
            </P1>
            <P1>
                <p1-name>A5</p1-name>
                    <p1-value/>
            </P1>

          <junk>1</junk>
      </servlet>

    <servlet>
        <servlet-name>DUMMY</servlet-name>
            <servlet-class>com.mm.bb.servlet.DUMMY</servlet-class>
            <P1>
                <p1-name>B1</p1-name>
                <p1-value>B11111</p1-value>
            </P1>


            <P1>
                <p1-name>B4</p1-name>
                    <p1-value/>
            </P1>
            <P1>
                <p1-name>B5</p1-name>
                    <p1-value/>
            </P1>

          <junk>1333</junk>
      </servlet>

    <servlet>
        <servlet-name>SAMMY</servlet-name>
            <servlet-class>com.mm.bb.servlet.SAMMY</servlet-class>
            <P1>
                <p1-name>C1</p1-name>
                <p1-value>B11111</p1-value>
            </P1>
            <P1>
                <p1-name>C2</p1-name>
                <p1-value>A22222</p1-value>
            </P1>
            <P1>
                <p1-name>C3</p1-name>
                    <p1-value/>
            </P1>
            <P1>
                <p1-name>C4</p1-name>
                    <p1-value/>
            </P1>
            <P1>
                <p1-name>C5</p1-name>
                    <p1-value/>
            </P1>

          <junk>12313</junk>
      </servlet>


    <D>
            <D1>
                <D11>admin</D11>            
            </D1>
            <D2>
                <D21>XX</D21>
            </D2>
    </D>

    <E>
         <E1>Yo</E1>
         <E2>Hello</E2>
    </E>

</web-app>

Use the identity transformation and an empty template for the elements you want to remove: 对要删除的元素使用标识转换和空模板:

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

<xsl:template match="servlet[servlet-name = 'DUMMY']/P1[p1-name = ('B2', 'B3')]"/>

At http://xsltransform.hikmatu.com/nbUY4ki I get the output http://xsltransform.hikmatu.com/nbUY4ki我得到了输出

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true">
   <P1>IGNORE1</P1>
   <P1>IGNORE2</P1>
   <servlet>
      <servlet-name>TEST</servlet-name>
      <servlet-class>com.mm.bb.servlet.TEST</servlet-class>
      <P1>
         <p1-name>A1</p1-name>
         <p1-value>A11111</p1-value>
      </P1>
      <P1>
         <p1-name>A2</p1-name>
         <p1-value>A22222</p1-value>
      </P1>
      <P1>
         <p1-name>A3</p1-name>
         <p1-value/>
      </P1>
      <P1>
         <p1-name>A4</p1-name>
         <p1-value/>
      </P1>
      <P1>
         <p1-name>A5</p1-name>
         <p1-value/>
      </P1>
      <junk>1</junk>
   </servlet>
   <servlet>
      <servlet-name>DUMMY</servlet-name>
      <servlet-class>com.mm.bb.servlet.DUMMY</servlet-class>
      <P1>
         <p1-name>B1</p1-name>
         <p1-value>B11111</p1-value>
      </P1>
      <P1>
         <p1-name>B4</p1-name>
         <p1-value/>
      </P1>
      <P1>
         <p1-name>B5</p1-name>
         <p1-value/>
      </P1>
      <junk>1333</junk>
   </servlet>
   <servlet>
      <servlet-name>SAMMY</servlet-name>
      <servlet-class>com.mm.bb.servlet.SAMMY</servlet-class>
      <P1>
         <p1-name>C1</p1-name>
         <p1-value>B11111</p1-value>
      </P1>
      <P1>
         <p1-name>C2</p1-name>
         <p1-value>A22222</p1-value>
      </P1>
      <P1>
         <p1-name>C3</p1-name>
         <p1-value/>
      </P1>
      <P1>
         <p1-name>C4</p1-name>
         <p1-value/>
      </P1>
      <P1>
         <p1-name>C5</p1-name>
         <p1-value/>
      </P1>
      <junk>12313</junk>
   </servlet>
   <D>
      <D1>
         <D11>admin</D11>
      </D1>
      <D2>
         <D21>XX</D21>
      </D2>
   </D>
   <E>
      <E1>Yo</E1>
      <E2>Hello</E2>
   </E>
</web-app>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM