2010-09-16 5 views
0

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

'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")]]' 

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

+0

Tha HTML фрагмент не является действительным XML/HTML - есть 'title' атрибут, который начинается с' Oded

+0

Пожалуйста, исправьте код.Я получаю ошибку: «Ошибка: ссылка на необъявленный объект« nbsp »« – Topera

+0

Что вы используете для применения этих запросов XPath? JQuery? Селен? Это важно. – LarsH

ответ

1

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

Так что, я думаю, что вам нужно это выражение 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')]] 

Тест для текстового узла descendat из td

+0

+1 избили меня. :-) (Примечание опечатка в 'descendat'.) – LarsH

+0

@LarsH: Спасибо за уведомление, что. Теперь это правильно. – 2010-09-16 14:48:51

+0

Спасибо. Ваше решение работает. – elbear

0

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

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

Строка() функция даст вам все текст в текущем и потомком узлах wherease text() просто дает вам текст в текущем (контекстном) узле.

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

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

И, как указано в приведенных выше комментариев, вы размещены XML/HTML является недействительным, поскольку это стоит.

+0

Это один из способов сделать это. Обратите внимание, что явная 'строка (.)' Избыточна, так как первый аргумент будет неявно преобразован в строку. Единственный недостаток заключается в том, что каждый td может быть преобразован в строку таким образом, что потребует много ненужной конкатенации строк для создания строк, которые будут выброшены. Но это может быть проблемой для небольших веб-страниц. – LarsH

0

Мое понимание состоит в том, что вы хотите выбрать элемент td в указанном классе, который имеет потоковый текстовый узел, содержащий значение «172.80».

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

Все перечисленные вами попытки страдают от проблемы, что преобразует свой первый аргумент в одну строку, используя только первый узел набора узлов. Поэтому, если td или div имеет дочерний или дочерний текстовый узел до того, который содержит «172.80», тот, который содержит «172.80», не будет замечен.

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

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

Спасибо тоже. Ваше решение также работает. – elbear

+0

@ LucianU: добро пожаловать. Вероятно, вы должны перенести ответы, которые считаете полезными, и принять один из них. – LarsH

+0

LarsH, я попробовал upvoting, но у меня нет достаточной репутации для этого. Кстати, спасибо также за то, что я ясно объяснил эту проблему. Теперь я понимаю, что было не так и, надеюсь, не повторит ошибку. – elbear

Смежные вопросы