Учитывая коды в здесь и здесь, я изменил их, чтобы объяснить свой вопрос. Теперь код выглядит так:

<?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"

Но я получаю только первый результат, а хочу их все.

1
MLMH 4 Май 2016 в 18:58

2 ответа

Лучший ответ

В дополнение к тому, что не нужны условные выражения (-i), на самом деле также нет необходимости сопоставлять (-m); просто получите значение (-v) ...

xmlstarlet sel -t -v "/*/book[Description/stock='YES']/Location/shelf" -n book.xml
0
Daniel Haley 13 Май 2016 в 16:41

Не нужно использовать условные выражения:

С этим я получаю автора, у которого есть книги в наличии

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
0
MLMH 13 Май 2016 в 15:52