Выберите n-го ребенка в xQuery / выберите следующий элемент - PullRequest
3 голосов
/ 17 декабря 2010

У меня проблемы с поиском хороших учебников по xQuery, в основном я пытаюсь получить текст etc... с этого html-узла

<div class="venue">
    <div class="vitem">
        <p style="padding: 6px 0pt 0pt;" class="label">ADDRESS:</p>
        <p class="item-big">blabla</p>
    </div><br class="clear">
    <div class="vitem">
        <p style="padding: 6px 0pt 0pt;" class="label">PHONE:</p>
        <p class="item-big">123</p>
    </div><br class="clear">
    <div class="vitem">
        <p style="padding: 6px 0pt 0pt;" class="label">WEB:</p>
        <p class="item-big">etc...</p>
    </div><br class="clear">
</div>

Я хотел бы узнать, как я могу получитьданные из 2-го р в третьем div[@class="vitem"]
Или р , непосредственно следующий за p[@class="label"], который содержит текст WEB:

Редактировать: Ответы уже очень помогли, однако мой второй вопрос: если макет изменится на что-то вроде этого

<div class="venue">
    <div class="vitem">
        <p style="padding: 6px 0pt 0pt;" class="label">ADDRESS:</p>
        <p class="item-big">blabla</p>
    </div><br class="clear">
    <div class="vitem">
        <p style="padding: 6px 0pt 0pt;" class="label">WEB:</p>
        <p class="item-big">etc...</p>
    </div><br class="clear">
</div>

Как мне получить etc..., зная только, что за ним следует метка класса, содержащая текст WEB:?его больше нет в div [3] / p [2]

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Я хотел бы знать, как я могу получить данные из 2-го р в третьем div [@ class = "vitem"]

Использовать :

/*/div[@class='vitem'][3]/p[2]/text()

Это означает: получить все дочерние элементы текстового узла второго p дочернего элемента третьего из всех div элементов, которые имеют атрибут class со значением "vitem" и чтоявляются потомками верхнего элемента.

Или p, непосредственно следующий за p [@ class = "label"] с данными WEB:

Use :

/*/div[@class='vitem'][3]/p[@class='label']
                             /following-sibling::p[1]/text()

Это означает: получить все дочерние элементы текстового узла первого следующего брата p любого элемента p с атрибутом class со значением "label", то естьдочерний элемент третьего элемента div, который имеет атрибут class со значением "vitem" и является дочерним элементом верхнего элемента.

UPDATE : OP добавилВторой вопрос: он хочет просто выбрать p, который имеет в качестве строкового значения текст "и т.д ..."

Использовать :

/*/div/p[.='etc...']
1 голос
/ 17 декабря 2010

Я хотел бы знать, как я могу получить данные из 2-го р в третий div[@class="vitem"] Или р , следующий непосредственно за p[@class="label"]

Семантически равные выражения XPath / XQuery:

/div
   /div[@class='vitem'][3]
      /p[2]

Или

/div
   /div[@class='vitem'][3]
      /p[@class='label']
         /following-sibling::p[1]
...