[言語不問]XML中の、特定文字列を持つ子要素を持つ親要素を消す方法


下記の(例1.変換前)のようなXML形式のファイルから、  
testを含む要素を丸っと削除したいと考えています。

testを含む要素が2000個ほどまばらに存在し、  
繰り返し行う作業のため、絶対自動化したいのですが、  
sedを使ってどう表現すればいいのかずっと頭を抱えています。

(例1.変換前) → testを含む要素を削除 → (例2.変換後)

このtestを含む要素の削除方法について、  
アドバイスをいただけないでしょうか。

実装言語としては、シェルスクリプトを想定していますが、ツール、言語等問いません。

恐らく実装された経験がある方、類似の方法を検索する際に必要なキーワードがピンとくる方からすれば楽勝案件なのでは・・・と思っています。そのため、ピンとくるキーワードだけの解答でも大変助かります。

(例1.変換前)

[code]

    <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>${jackson.version}</version>
          <type>jar</type>
          <scope>compile</scope>
    </dependency>
    <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>${jackson.version}</version>
          <type>test</type>
          <scope>compile</scope>
    </dependency>
    
[/code]

(例2.変換後)

[code]

    <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>${jackson.version}</version>
          <type>jar</type>
          <scope>compile</scope>
    </dependency>
    
[/code]




`sed` は行指向のコマンドですので、XML のようなフォーマットを扱うのは非常に難しく、殆ど不可能です。  
シェルスクリプトで XML を扱うには、

  * XML 専用のコマンドを使用する
  * XML を行指向のフォーマットに変換してから処理する
  * 該当部分だけ、XML を扱うライブラリが用意されているプログラミング言語でコマンドとして作成する

といった事が必要です。  
XML 専用のコマンドをいくつか紹介すると、`xsltproc`(XSLT
を覚える必要がある)、`xmllint`(今回の例には力不足か)、`xmlstarlet`(xpath で簡単な編集までならできる)などです。

`xmlstarlet` を使用する例:

[code]

    # この xpath が質問の要件を満たしているかは、十分に検討していません
    xmlstarlet ed -d '//dependency[type[text()="test"]]' in.xml
    
[/code]

