Проблема выражения XPath - PullRequest
       1

Проблема выражения XPath

0 голосов
/ 16 сентября 2010

У меня есть следующий фрагмент HTML, http://paste.enzotools.org/show/1209/, и я хочу извлечь тег с потомком text () со значением "172.80" (это четвертый узел из этого фрагмента).До сих пор мои попытки были:

'descendant::td[@class="roomPrice figure" and contains(descendant::text(), "172.80")]'
'descendant::td[@class="roomPrice figure" and contains(div/text(), "172.80")]'
'descendant::td[@class="roomPrice figure" and div[contains(text(), "172.80")]]'

, но ни одна из них ничего не выбирала.У кого-нибудь есть предложения?

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

При передаче узла, установленного на вызовы функций, обратите внимание, что если сигнатура функции не объявляет аргумент набора узлов, она будет преобразовывать первый узел из этого набора узлов.

Итак, я думаю, что вынужно это выражение XPath:

descendant::td[@class="roomPrice figure"][div[text()[contains(.,'172.80')]]]

Тест для дочернего текстового узла div

или

descendant::td[@class="roomPrice figure"]
              [div[descendant::text()[contains(.,'172.80')]]]

Тестдля потомка текстового узла div

или

descendant::td[@class="roomPrice figure"]
              [descendant::text()[contains(.,'172.80')]]

Проверка на потомок текстового узла td

0 голосов
/ 16 сентября 2010

Насколько я понимаю, вы хотите выбрать элемент td в указанном классе, у которого есть текстовый узел-потомок, содержащий значение "172.80".

Я предполагаю, что контекстным узлом является <tr> (или какой-то его предок).

Все перечисленные попытки страдают от проблемы, заключающейся в том, что contains() преобразует свой первый аргумент в одну строку, используя только первый узел набора узлов. Таким образом, если td или div имеет дочерний или дочерний текстовый узел перед тем, который содержит "172.80", тот, который содержит "172.80", не будет замечен.

Попробуйте это:

'descendant::td[@class="roomPrice figure" and
                descendant::text()[contains(., "172.80")]]'
0 голосов
/ 16 сентября 2010

Я полагаю, вы хотите что-то вроде этого:

<xsl:for-each select="//td[contains(string(.), '172.80')]">

Функция string () выдаст вам весь текст в текущем и дочернем узлах, а text () просто выдаст вам текст в текущем (context) node.

Конечно, вы расширяете селектор xpath, чтобы фильтровать и имена классов тоже ...

<xsl:for-each select="//td[contains(string(.), '172.80')][@class='roomPrice figure']">

И, как указано в комментариях выше, вы отправляете xml/ html недействителен в его нынешнем виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...