0

ローカル開発用に特別な web.xml を作成しようとしています。

最終的なweb.xml内の特定の位置に選択して貼り付ける必要がある別の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>
4

2 に答える 2

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"/>
于 2012-04-02T16:22:31.603 に答える
0

XPath は、XML ドキュメントの XML Infoset で動作するクエリ言語です。結果を返すか、ノードを選択することしかできませんが、ソース XML ドキュメントの構造を変更したり、変更したりすることはできません

特に XML ドキュメントを処理し、新しい XML ドキュメントを生成するために設計された適切な言語は、XSLT です。

質問で指定されたタスクは、XSLT を使用して非常に簡単な方法で実行できます。

完全な (ただし最小限の) ソース XML ドキュメント、完全な必要な結果を提供し、変換が従うべき規則を指定してください。そうすれば、多くの人が正しい有用な解決策を提供できるようになります。

于 2011-02-18T14:15:43.220 に答える