如何使用ant xmltask扩展XML文件,方法是将标记从源文件复制到特定位置的dest文件

时间:2011-02-18 12:59:00

标签: ant xpath web.xml xmltask

我正在尝试为本地开发创建一个特殊的web.xml。

我有一些标签存储在一个单独的xml文件中,需要选择并粘贴到最终web.xml中的特定位置。

为了达到这个目的,我按照以下方式使用复制和粘贴操作:

<xmltask source="templates.xml">
  <copy path="//data/init-param" buffer="initParamBuffer"/>
</xmltask>

<xmltask source="web.xml" dest="web.xml">
  <paste path="//web-app/filter[contains(./filter-name,'MyFilter')]
                           /init-param[contains(./param-name,
                                                'MyInitParameter')]"
         position="after" buffer="initParamBuffer"/>
</xmltask>

我的目的是从源文件中收集所有init-param标签,并在粘贴操作中选择的标签后粘贴它们。

使用contains()函数选择包含具有指定内容的标记的标记的部分也不能正常工作。

也许有更好的方法来形成这个xpath表达式......


更新

正如我之前所写,我不知道解决这个问题的最佳方法。我已经读过关于使用样式表进行转换的可能性,但是由于ant-xmltask承诺是一个更加简洁的解决方案,所以我首先尝试过。

就我采用这种方法而言,可以使用这种方法将标签插入/写入web.xml。我已经成功地将单个init-param标签插入到可以轻松关闭的位置,并且表达式不那么复杂:

<paste path="//web-app/filter[1]/init-param"
             position="after" buffer="initParamBuffer"/>

所以我的问题是: 答:我想在缓冲区中选择多个标签 B:我想在名称(而不是索引)指定的标签之后插入该缓冲区的内容。

以下是要插入web.xml的源(templates.xml)的示例:

<data>
  <init-param>
    <param-name>newparam1</param-name>
    <param-value>1</param-value>
  </init-param>
  <init-param>
    <param-name>newparam2</param-name>
    <param-value>2</param-value>
  </init-param>
</data>

以下是要粘贴上述部分的web.xml的一部分:

<web-app>
  <filter-mapping>
    <filter-name>SomeFilter</filter-name>
    <url-pattern>/somePath/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/myPath/*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>SomeFilter</filter-name>
    <filter-class>foo.bar.SomeFilter</filter-class>
    <init-param>
      <param-name>SomeInitParameter</param-name>
      <param-value>4711</param-value>
    </init-param>
  </filter>
  <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>foo.bar.MyFilter</filter-class>
    <init-param>
      <param-name>MyInitParameter</param-name>
      <param-value>0815</param-value>
    </init-param>
  </filter>
</web-app>

以下是我希望实现的结果:

<web-app>
  <filter-mapping>
    <filter-name>SomeFilter</filter-name>
    <url-pattern>/somePath/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/myPath/*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>SomeFilter</filter-name>
    <filter-class>foo.bar.SomeFilter</filter-class>
    <init-param>
      <param-name>SomeInitParameter</param-name>
      <param-value>4711</param-value>
    </init-param>
  </filter>
  <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>foo.bar.MyFilter</filter-class>
    <init-param>
      <param-name>MyInitParameter</param-name>
      <param-value>0815</param-value>
    </init-param>
    <init-param>
      <param-name>newparam1</param-name>
      <param-value>1</param-value>
    </init-param>
    <init-param>
      <param-name>newparam2</param-name>
      <param-value>2</param-value>
    </init-param>
  </filter>
</web-app>

2 个答案:

答案 0 :(得分:1)

使用XPath或:

路径|路径

自:

<paste path="//web-app/filter[1]/init-param" position="after" buffer="initParamBuffer"/>

要:

<paste path="//web-app/filter[1]/init-param|//web-app/filter[2]/init-param" position="after" buffer="initParamBuffer"/>

答案 1 :(得分:0)

XPath是一种在XML Infoset的XML文档上运行的查询语言。它只能返回结果或选择节点,但它不能更改源XML文档的结构或以任何方式修改它

一种适用于处理XML文档和生成新XML文档的合适语言是XSLT。

您的问题中指定的任务可以使用XSLT以非常简单的方式完成。

请提供完整(但最小)的源XML文档,完整的想要结果并指定转换应遵循的任何规则。然后许多人将能够为您提供正确和有用的解决方案。