【问题标题】:How to extend an XML File using ant xmltask by copying tags from a source-file to the dest-file in specific positions如何使用 ant xmltask 通过将标签从源文件复制到特定位置的目标文件来扩展 XML 文件
【发布时间】:2011-02-18 12:59:00
【问题描述】:

我正在尝试为本地开发创建一个特殊的 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"/>

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

这是一个将源(templates.xml)插入到 web.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>

【问题讨论】:

    标签: ant xpath web.xml xmltask


    【解决方案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"/>
    

    【讨论】:

      【解决方案2】:

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

      XSLT 是一种专门为处理 XML 文档和生成新的 XML 文档而设计的合适语言。

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

      请提供完整的(但最小的)源 XML 文档、完整的所需结果并指定转换应遵循的任何规则。然后很多人就能给你正确有用的解决方案。

      【讨论】:

      • 你是对的,但我首先选择了不同的解决方案,因为与一两个额外的 ant 指令相比,在构建过程中额外的样式表会产生过热。如果我的问题不能用 ant xmltask 解决,我肯定会采用 xslt 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多