Извлечение и сброс элементов с помощью xmlstarlet

Я ищу способ извлечь и распечатать элемент из моего xml с помощью xmlstarlet; например, если мой 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 as:

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

Я понимаю запрос xpath для выбора такого элемента (/bookstore/book[price=29.99]), но Я не могу распечатать/сбросить его на stdout. Если я использую опцию -v и использую -v (.), Я не получаю вывод, как я хочу (со всеми тегами в нем), я просто получаю текстовые значения. Должен быть способ просто сбрасывать выбранный элемент так, как есть, и то, что я ищу.

Спасибо в ожидании.

Ответы

Ответ 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>

Вы можете просмотреть XSLT, сгенерированный внутри xmlstarlet, добавив глобальный переключатель "-C" после "sel". Это показывает, как вариант копирования приводит к созданию копии xslt:

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

Это приводит к тому, что узлы пространства имен, дочерние узлы и узлы атрибутов включены, ср. спецификация XSLT (см. резюме w3schools).