2011-02-18 6 views
0

로컬 개발을 위해 특수 web.xml을 만들려고합니다.특정 위치에있는 소스 파일에서 대상 파일로 태그를 복사하여 ant xmltask를 사용하여 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"/> 

그래서 내 문제였다 A : 내가 버퍼 에 하나 개 이상의 태그를 선택합니다 B : 이름 (인덱스가 아님)으로 지정된 태그 다음에 버퍼의 내용을 삽입하려고합니다. 여기

는 web.xml에 삽입하는 소스의 일례 (templates.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 문서의 구조를 변경하거나 어떤 식 으로든 수정할 수는 없습니다.

특히 XML 문서 처리와 새로운 XML 문서 생성을 위해 설계된 적합한 언어는 XSLT입니다.

질문에 지정된 작업은 XSLT를 사용하여 매우 쉽게 할 수 있습니다.

완전한 (그러나 최소한의) 소스 XML 문서와 완전한 결과를 제공하고 변환이 따라야하는 규칙을 지정하십시오. 그러면 많은 사람들이 정확하고 유용한 해결책을 줄 수있을 것입니다.

+0

자네 말이 맞아,하지만 내가 먼저 다른 sollution에 들어갑니다 , 빌드에 추가적인 스타일 시트에 의해 생성 된 과열로 인해 하나 또는 두 개의 추가적인 ant 지시문에 비해 ocess. 개미 xmltask 내 문제를 해결할 수없는 경우 반드시 xslt 접근 방식을 취할 것입니다. – elfwyn

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"/>