16

xmlstarletを使用してxmlから要素を抽出して出力する方法を探しています。たとえば、私のxmlが

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

価格=29.99の本の要素を次のように印刷したいと思います。

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

そのような要素(/ bookstore / book [price = 29.99])を選択するためのxpathクエリを理解していますが、stdoutに印刷/ダンプできません。'-v'オプションを使用して-v(。)を使用すると、(すべてのタグが含まれている)希望どおりに出力が得られず、テキスト値が得られます。選択した要素をそのままダンプする方法があるはずです。それが私が探しているものです。

期待してくれてありがとう。

4

1 に答える 1

19

「-c」(コピー)オプションを使用すると、目的の結果が得られるはずです。

xmlstarlet sel -t -c "/bookstore/book[price=29.99]" books.xml

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

「sel」の後にグローバルな「-C」スイッチを追加することで、xmlstarletで内部的に生成されたXSLTを監視できます。これは、コピーオプションがどのようにxsltcopy-ofコンストラクトになるかを示しています。

...
<xsl:template name="t1">
  <xsl:copy-of select="/bookstore/book[price=29.99]"/>
</xsl:template>
...

これにより、名前空間ノード、子ノード、および属性ノードが含まれます。XSLT仕様(w3schoolsの要約を参照)

于 2009-12-13T18:33:37.907 に答える