Somtirtha Ghosh
Somtirtha Ghosh

Reputation: 57

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.

Upvotes: 1

Views: 97

Answers (1)

Yitzhak Khabinsky
Yitzhak Khabinsky

Reputation: 22167

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>

Upvotes: 1

Related Questions