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>

我了解选择此类元素的 xpath 查询(/bookstore/book[price=29.99]),但我无法在标准输出上打印/转储它。如果我使用 '-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。这显示了复制选项如何导致 xslt 复制构造:

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

这会导致名称空间节点、子节点和属性节点被包括在内,参见。XSLT 规范(参见 w3schools 摘要)

于 2009-12-13T18:33:37.907 回答