我試圖爲本地開發創建特殊的web.xml。如何使用ant xmltask通過將源文件中的標記複製到特定位置的dest文件來擴展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標籤是哪裏sligtly關,用不太複雜的表達式:
<paste path="//web-app/filter[1]/init-param"
position="after" buffer="initParamBuffer"/>
所以我的問題是: 答:我想選擇一個以上標籤到緩衝區 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>
你是對的,但我去一個不同的sollution第一,因爲構建公式中的附加樣式表會產生過熱與一個或兩個額外的ant指令相比。如果我的問題無法用ant xmltask解決,我一定會採用xslt方法。 – elfwyn 2011-02-19 12:02:59