Учитывая коды в здесь и здесь, я изменил их, чтобы объяснить свой вопрос. Теперь код выглядит так:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<Description>
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<stock>YES</stock>
</Description>
<Location>
<restock>UMG</restock>
<shelf>30</shelf>
</Location>
</book>
<book category="CHILDREN">
<Description>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<stock>NO</stock>
</Description>
<Location>
<restock>GIP</restock>
<shelf>20</shelf>
</Location>
</book>
<book category="CHILDREN">
<Description>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2015</year>
<stock>YES</stock>
</Description>
<Location>
<restock>GIP</restock>
<shelf>21</shelf>
</Location>
</book>
<book category="WEB">
<Description>
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<year>2003</year>
<stock>YES</stock>
</Description>
<Location>
<restock>NGT</restock>
<shelf>11</shelf>
</Location>
</book>
Моя личная проблема заключается в том, что я хочу сначала проверить, есть ли книга в наличии, а если есть, то проверить полку, где она находится. Доступ к стоимости акций, если довольно просто:
xmlstarlet sel -t -c "/bookstore/book/Description[stock='YES']" book.xml
Но я не умею делать условное. В руководстве по xmlstarlet сказано, что я должен использовать -i или --if, но я пытался сделать это следующим образом:
xmlstarlet sel -t -c -i "/bookstore/book/Description[stock='YES']" -v "/bookstore/book/Location/shelf" book.xml
Потому что видел похожую проблему, но теперь она работает. Есть идеи?
РЕДАКТИРОВАТЬ:
Используя следующий подход, я не получаю ошибок, но вообще ничего
cat book.xml | xmlstarlet sel -t -m "/bookstore/book/Description" -i "@stock='YES'" -v '/bookstore/book/Location/shelf'
РЕДАКТИРОВАТЬ 2:
Я думал о том, что было бы, если бы у меня были две книги, названные одинаково. Я отредактировал код выше, и теперь у меня есть 2 книги под названием Гарри Поттер, каждая с разными датами публикации и полками.
Следуя подходу Дэниела Хейли, я хочу знать всю книгу с названием Гарри Поттер:
xmlstarlet sel -t -v "/*/book[Description/title='Harry Potter']/Location/shelf"
Но я получаю только первый результат, а хочу их все.
2 ответа
В дополнение к тому, что не нужны условные выражения (-i
), на самом деле также нет необходимости сопоставлять (-m
); просто получите значение (-v
) ...
xmlstarlet sel -t -v "/*/book[Description/stock='YES']/Location/shelf" -n book.xml
Не нужно использовать условные выражения:
С этим я получаю автора, у которого есть книги в наличии
xmlstarlet sel -t -m "/bookstore/book/Description[stock='YES']" -v author -n book.xml
Это даст все полки. Приближаемся, но не совсем то, что мы хотим
xmlstarlet sel -t -m "/bookstore/book/Description[stock='YES']" -v "/bookstore/book/Location/shelf" -n book.xml
Наконец, этот даст вам полки с книгами, которые есть в наличии.
xmlstarlet sel -t -m "/bookstore/book[Description[stock='YES']]" -v "Location/shelf" -n book.xml
Похожие вопросы
Связанные вопросы
Новые вопросы
xml
XML (Extensible Markup Language) - это формат структурированного документа, определяющий правила кодирования текста. При использовании этого тега включайте дополнительные теги, такие как язык программирования, наборы инструментов, используемые технологии XML и другие теги, описывающие среду, в которой опубликована проблема. Гибкость XML обеспечивает широкий спектр применений для передачи человеческих и машинных данных, в том числе конкретных инструментов и библиотек.