2009-05-19 2 views
2

У меня есть документ XHTML, и я хочу выбрать в нем единственную таблицу с классом = "index".Выбор конкретной таблицы с XPath

Если я правильно понимаю, ось потомка выберет все узлы, которые прямо и косвенно будут спускаться с текущего узла, так что вот что у меня есть.

//descendant::table[@class="index"] 

Он, похоже, не работает при тестировании с помощью xmlstarlet. Является ли мой инструмент сломанным, или выражение XPath неверно?

+1

Если вы размещаете ввод образца, мы могли бы знать наверняка, является ли сломанный инструмент. (Например, возможно, вам нужно использовать префикс пространства имен.) Одна быстрая заметка // // потомок :: избыточна. В этом случае используйте либо/devcendant :: table (только одну косую черту), либо просто // таблицу. «//» является сокращением для «/ descendant-or-self :: node() /» –

+0

metacritic.com/film/highscores.shtml является одним из таких примеров, но его нужно пройти через Tidy и некоторые другие настройки, прежде чем XSLT готов. – jldugger

+0

Учетные записи включают добавление объявления пространства имен XHTML? В XPath вы должны объявить пространство имен (и использовать префикс в своем выражении), если вы хотите выбрать узлы по имени, которые используют пространство имен. –

ответ

2

Основываясь на вашем примере страницы (metacritic.com/film/highscores.shtml), я бы сказал, что вам нужно использовать:

//TABLE[@CLASS="index"] 
(or /descendant::TABLE[@CLASS="index"]) 

Это потому что таблица с индексом CLASS записывается в верхнем регистре на ваша страница примера (XML и XPath чувствительны к регистру).

Это будет работать, если вы ориентируетесь на определенную страницу, но, вероятно, станет проблемой, если разные страницы используют разные случаи для тех же тегов html.

Тогда вам нужно мерзости, как

//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...] 
|//table[@CLASS="index" or @class="index" or ...] 
|... 

Таким образом, вы, вероятно, нужно продолжать использовать Tidy перед извлечением информации, или переключиться на инструмент, который специализировался на HTML выскабливание (вместо XPath)

+0

Действительно, порядок - это часть процесса, но он танки на некотором плохо отформатированном HTML, который помещает td внутри формы. У меня уже есть почти рабочая версия, основанная на BeautifulSoup и uTidy; выяснить, как исправить уродливую форму через аккуратный или sed - следующий шаг, который я думаю. – jldugger

3

Я думаю //table[@class="index"] является то, что вы хотите

1

Да, descendant оси выбирает все узлы нисходящих из контекстного узла. Но ключевым здесь является контекстный узел.

Например, descendant::span будет извлекать всех потомков span текущего узла. В том же ключе descendant::* будет извлекать все элементы-потомки текущего узла.

Если вам нужно, чтобы соответствовать таблице, а также детей, то вы XPath при условии, отлично работает во время моего теста:

//descendant::table[@class="index"] 

... выбирает сам и ChildNodes табл.

Если вам нужно только, чтобы соответствовать детям таблицы, первым соответствуют узлу вы хотите , а затем соответствовать его потомкам:

//table[@class="index"]/descendant::* 

.. выбирает только дочерние узлы таблицы.

0

использовать этот код

let $info :=($p//descendant::TABLE[@class="index"]) 
     return $info 
Смежные вопросы