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