如何解决从ant目标替换多行xml文件
我有一个包含大约 10 个 servlet 的 web.xml,其中定义了一些基本配置,如下所示:
<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>
现在,根据某些条件,从我的 ant 目标中,我需要删除两个虚拟 servlet 及其映射,但需要保留实际 servlet 及其映射。有人可以建议什么是最好/最简单的方法吗?
我应该使用 ant <replace>
还是 xmltask 或其他一些功能?
替换整个 web.xml 不是一种选择。
解决方法
我冒昧地在提供的 XML 中添加了一个根元素以使其格式良好。
请通过 XSLT 尝试以下解决方案。
XSLT 使用所谓的身份转换模式。
您需要为真实的 XML 修改两个模板:并提供要删除的虚拟 Servlet 列表。
虚拟 Servlet 之外的所有其他内容都将保持不变。
请记住 XML 区分大小写,包括实际值。
输入 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>
输出 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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。