Извлечение и сброс элементов с помощью 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).