Как я мог просто этот xpath, чтобы xmlstartlet работал с ним? - PullRequest
0 голосов
/ 20 мая 2011
$ xmlstarlet sel -t -c "//str[@name="id" and .="http://localhost:8080/index.html"]/../str[@name="doc-norm"]"/value results.xml

Насколько я понимаю, xmlstarlet не полностью поддерживает выражения xpath. Есть ли другой инструмент командной строки, который делает BTW?

<doc>
    <str name="id">http://localhost:8080/index.html</str>
    <str name="doc-norm">6</str>
</doc>

1 Ответ

2 голосов
/ 21 мая 2011

Вы пытаетесь вернуть 6 из вашего примера?

У меня нет xmlstarlet для тестирования, но попробуйте этот XPath:

//*[str[@name='id']='http://localhost:8080/index.html']/str[@name='doc-norm']

Это должно вернуть значение элемента str, который имеет атрибут name со значением doc-norm, когда его родительский элемент имеет дочерний элемент str, который имеет атрибут id со значением http://localhost:8080/index.html. (Надеюсь, это имеет смысл!)

Я должен также добавить, что если вы знаете, каков уровень родительского элемента, постарайтесь избегать использования //. Что-то вроде /doc[str[@name='id']='http://localhost:8080/index.html']/str[@name='doc-norm'] будет более эффективным.

UPDATE

Я скачал xmlstartlet для тестирования, и он работает нормально, однако он возвращает весь элемент str. Если вы хотите только текст, добавьте text() в конец XPath:

//*[str[@name='id']='http://localhost:8080/index.html']/str[@name='doc-norm']/text()

...