2016-05-04 2 views
1

Учитывая коды в here и here, я изменил их, чтобы объяснить свой вопрос. Теперь код выглядит следующим образом:Условные в XML-файле с использованием xmlstarlet

<?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 или --Если, но я пытался сделать это следующим образом:

xmlstarlet sel -t -c -i "/bookstore/book/Description[stock='YES']" -v "/bookstore/book/Location/shelf" book.xml 

Потому что я видел подобную проблему, но она сейчас работает. Есть идеи?

EDIT:

Используя следующий подход, я не получаю ошибки, но ничего на всех

cat book.xml | xmlstarlet sel -t -m "/bookstore/book/Description" -i "@stock='YES'" -v '/bookstore/book/Location/shelf' 

EDIT 2:

Я думал о том, что произошло бы, если У меня две книги, называемые одинаковыми. Я редактировал код выше, и теперь я 2 книги под названием Гарри Поттер, каждый из них с различными датами публикации и полки

Следуя Daniel Хейли подход, я хочу знать всю книгу с названием Гарри Поттер:

xmlstarlet sel -t -v "/*/book[Description/title='Harry Potter']/Location/shelf" 

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

ответ

0

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

xmlstarlet sel -t -v "/*/book[Description/stock='YES']/Location/shelf" -n book.xml 
0

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

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

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 
Смежные вопросы