我正在寻找一种使用xmlstarlet从xml中提取和打印元素的方法;例如,如果我的xml是
<;?xml version=“1.0”encoding=“ISO-8859-1”?>;
<;书店>;
<;书籍>;
<;title lang=“eng”>;哈利波特</标题>;
<;价格>;29.99</价格>;
</书籍>;
<;书籍>;
<;title lang=“eng”>;学习XML</标题>;
<;价格>;39.95</价格>;
</书籍>;
</书店>;
我想将价格为29.99的book element打印为:
<;书籍>;
<;title lang=“eng”>;哈利波特</标题>;
<;价格>;29.99</价格>;
</书籍>;
我理解xpath查询选择这样一个元素(/bookstore/book[price=29.99]),但是
我无法在标准输出上打印/转储它。如果我使用“-v”选项并使用-v(.)我不会得到我想要的输出(其中包含所有标记),我只会得到文本值。应该有一种方法可以简单地按原样转储所选元素,这就是我要寻找的
谢谢你的期待
使用“-c”(复制)选项,应实现您的目标:
xmlstarlet sel-t-c”/bookstore/book[price=29.99]“books.xml
<;书籍>;
<;title lang=“eng”>;哈利波特</标题>;
<;价格>;29.99</价格>;
</书籍>;
您可以通过在“sel”之后添加全局“-C”开关来查看xmlstarlet中内部生成的XSLT。这显示了复制选项如何生成构造的xslt副本:
。。。
<;xsl:template name=“t1”>;
<;xsl:select=“/bookstore/book[price=29.99]”的副本;
</xsl:template>;
...
这将导致包含名称空间节点、子节点和属性节点,参见XSLT规范(请参见W3S摘要)