使用xmlstarlet提取和转储元素

我正在寻找一种使用xmlstarlet从xml中提取和打印元素的方法;例如,如果我的xml是

<?xml version=“1.0”encoding=“ISO-8859-1”?>
<书店>
<书籍>
<title lang=“eng”>哈利波特&lt/标题>
<价格>29.99&lt/价格>
&lt/书籍>
<书籍>
<title lang=“eng”>学习XML&lt/标题>
<价格>39.95&lt/价格>
&lt/书籍>
&lt/书店>

我想将价格为29.99的book element打印为:

<书籍>
<title lang=“eng”>哈利波特&lt/标题>
<价格>29.99&lt/价格>
&lt/书籍>

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

谢谢你的期待

使用“-c”(复制)选项,应实现您的目标:

xmlstarlet sel-t-c”/bookstore/book[price=29.99]“books.xml
<书籍>
<title lang=“eng”>哈利波特&lt/标题>
<价格>29.99&lt/价格>
&lt/书籍>

您可以通过在“sel”之后添加全局“-C”开关来查看xmlstarlet中内部生成的XSLT。这显示了复制选项如何生成构造的xslt副本:

。。。
<xsl:template name=“t1”>
<xsl:select=“/bookstore/book[price=29.99]”的副本;
&lt/xsl:template>
...

这将导致包含名称空间节点、子节点和属性节点,参见XSLT规范(请参见W3S摘要)

发表评论