2011-02-18 46 views
0

我試圖爲本地開發創建特殊的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> 

回答

0

XPA th是一種在XML文檔的XML Infoset上操作的查詢語言。它只能返回結果或選擇節點,但它不能更改源XML文檔的結構或以任何方式修改它

XSLT是一種專門用於處理XML文檔並生成新XML文檔的合適語言。

您的問題中指定的任務可以使用XSLT以非常簡單的方式完成。

請提供一個完整的(但最小的)源XML文檔,完整的想要的結果並指定轉換應遵循的任何規則。那麼很多人將能夠給你正確和有用的解決方案。

+0

你是對的,但我去一個不同的sollution第一,因爲構建公式中的附加樣式表會產生過熱與一個或兩個額外的ant指令相比。如果我的問題無法用ant xmltask解決,我一定會採用xslt方法。 – elfwyn 2011-02-19 12:02:59

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"/> 
相關問題