xmlantxmltask

Replacing multiple lines of xml file from ant target


I have a web.xml with around 10 servlets defined with some basic configuration such as below:

    <servlet>
    <servlet-name>dummyServlet</servlet-name>
    <servlet-class>com.abc.Servlet</servlet-class>
    <init-param>
        <param-name>target</param-name>
        <param-value>foo.com</param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dummyServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

        <servlet>
    <servlet-name>dummyServlet2</servlet-name>
    <servlet-class>com.abc.Servlet2</servlet-class>
    <init-param>
        <param-name>target</param-name>
        <param-value>foo.com</param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dummyServlet2</servlet-name>
    <url-pattern>/dummy</url-pattern>
</servlet-mapping>

        <servlet>
    <servlet-name>actualServlet</servlet-name>
    <servlet-class>com.abc.ActualServlet</servlet-class>
    <init-param>
        <param-name>target</param-name>
        <param-value>foo.com</param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>dummyServlet</servlet-name>
    <url-pattern>/actual</url-pattern>
</servlet-mapping>

Now, from my ant target, based on some conditions, I need to remove both dummy-servlets along with their mappings but need to retain the actual-servlet and it's mapping. Can someone please suggest what would be the best/easy way to do that? Should I use ant <replace> or xmltask or some other feature? Replacing the entire web.xml is not an option.


Solution

  • I took a liberty, and added a root element to the provided XML to make it well-formed.

    Please try the following solution via XSLT.

    The XSLT is using so called Identity Transform pattern.

    You would need to modify two templates for your real XML: and provide a list of dummy Servlets to be removed.

    Everything else outside of the dummy Servlets will be kept intact.

    Please remember that XML is case sensitive, including actual values.

    Input XML

    <root>
        <servlet>
            <servlet-name>dummyServlet</servlet-name>
            <servlet-class>com.abc.Servlet</servlet-class>
            <init-param>
                <param-name>target</param-name>
                <param-value>foo.com</param-value>
            </init-param>
            <init-param>
                <param-name>log</param-name>
                <param-value>true</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dummyServlet</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>dummyServlet2</servlet-name>
            <servlet-class>com.abc.Servlet2</servlet-class>
            <init-param>
                <param-name>target</param-name>
                <param-value>foo.com</param-value>
            </init-param>
            <init-param>
                <param-name>log</param-name>
                <param-value>true</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dummyServlet2</servlet-name>
            <url-pattern>/dummy</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>actualServlet</servlet-name>
            <servlet-class>com.abc.ActualServlet</servlet-class>
            <init-param>
                <param-name>target</param-name>
                <param-value>foo.com</param-value>
            </init-param>
            <init-param>
                <param-name>log</param-name>
                <param-value>true</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dummyServlet</servlet-name>
            <url-pattern>/actual</url-pattern>
        </servlet-mapping>
    </root>
    

    XSLT

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="servlet[servlet-name=('dummyServlet','dummyServlet2')]">
        </xsl:template>
            <xsl:template match="servlet-mapping[servlet-name=('dummyServlet','dummyServlet2')]">
        </xsl:template>
    </xsl:stylesheet>
    

    Output XML

    <root>
      <servlet>
        <servlet-name>actualServlet</servlet-name>
        <servlet-class>com.abc.ActualServlet</servlet-class>
        <init-param>
          <param-name>target</param-name>
          <param-value>foo.com</param-value>
        </init-param>
        <init-param>
          <param-name>log</param-name>
          <param-value>true</param-value>
        </init-param>
      </servlet>
    </root>