【问题标题】:Extracting and dumping elements using xmlstarlet使用 xmlstarlet 提取和转储元素
【发布时间】:2009-12-11 20:29:49
【问题描述】:

我正在寻找一种使用 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 元素打印为:

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

我了解选择此类元素的 xpath 查询 (/bookstore/book[price=29.99]),但是 我无法在标准输出上打印/转储它。如果我使用 '-v' 选项并使用 -v (.) 我不会得到我想要的输出(其中包含所有标签),我只会得到文本值。应该有一种方法可以简单地转储选定的元素,这就是我正在寻找的。​​p>

感谢期待。

【问题讨论】:

    标签: xml xmlstarlet


    【解决方案1】:

    使用“-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 规范(see w3schools summary)

    【讨论】:

    • 必须更改多个字符,以逃避 SO 6 个字符的最小更改限制。除非我将 @ 放在属性前面,否则对我不起作用,即 @price=29.99 而不是 price=29.99
    • 谢谢.. 我花了将近一个月的时间寻找这个 -c 开关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多