Как расширить XML-файл с помощью ant xmltask, скопировав теги из исходного файла в файл dest в определенных местах - PullRequest
0 голосов
/ 18 февраля 2011

Я пытаюсь создать специальный 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>

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Использовать 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"/>
0 голосов
/ 18 февраля 2011

XPath - это язык запросов, работающий с набором XML документов XML. Он может только возвращать результаты или выбирать узлы, но не может изменять структуру исходного XML-документа или каким-либо образом изменять его .

Подходящим языком, разработанным специально для обработки XML-документов и создания новых XML-документов, является XSLT.

Задача, указанная в вашем вопросе, может быть выполнена очень просто с помощью XSLT.

Пожалуйста, предоставьте полный (но минимальный) исходный XML-документ, полный требуемый результат и укажите все правила, которым должно следовать преобразование. Тогда многие люди смогут дать вам правильные и полезные решения.

...