2010-04-23 2 views
9

Предположим, у меня есть полный html-документ в качестве XML-ввода.
Как бы выглядел XSLT-файл, если я хочу только вывести первое (или любое) изображение из html?XSLT Получить первое вхождение определенного тега

+0

Что вы получили до сих пор? Что не работает? – Oded

+0

Хороший вопрос (+1). См. Мой ответ для единственного правильного решения. :) –

ответ

17

выражение Один XPath, который выбирает первый <img> элемент в документе:

(//img)[1]

Обратите внимание, чточастую ошибку - как это сделано у @Oded в своем ответе является предложите следующее выражение XPath - в общем случае он может выбрать более одного элемента:

//img[1] (: WRONG !!! :)

Это выбирает все элементы <img> в документе, каждый из которых является первым дочерним элементом его родителя <img>.

Вот точное объяснение этой частой ошибки - в W3C XPath 1.0 Recommendation:

ПРИМЕЧАНИЕ: Расположение пути //para[1] не означает, что то же самое, как путь /descendant::para[1] местонахождения. Последний выбирает первый элемент потомка para; первый выбирает всех потомков para элементов, которые являются первыми пара детьми своих родителей.

Дальнейшая проблема существует, если документ определил пространство имен по умолчанию, которое должно иметь место с XHTML. XPath рассматривает любое неподписанное имя как принадлежащее без пространства имен, а выражение (//img)[1] не выбирает узел, потому что в документе нет элемента, который принадлежит , и не имеет пространства имен и имеет имя img.

В этом случае есть два способа указать желаемое выражение XPath:

  1. (//x:img)[1] - где префикс x связан (языком хостинг) с определенной namespcae по умолчанию (в данном случае это это XHTML пространство имен).

  2. (//*[name()='img'])[1]

+0

Является ли ваш «неправильный» пример отсутствием '[1]'? – AakashM

+0

@AakashM: Спасибо, исправлено. –

+1

Отличное объяснение, отличное решение. – Lobo

2

Выражение XPath будет отображать первое изображение со страницы HTML: (//img)[1].

См. Ответ от @Dimitre Novatchev для получения дополнительной информации о проблемах с ним.

+0

См. Мой ответ для объяснения проблемы с вашим ответом. Прочитайте спецификацию XPath - определение аббревиатуры '//' и выполните поиск этой частой ошибки.Если проблема еще неясна, задайте отдельный вопрос, и многие люди будут рады объяснить. :) –

+0

** Этот ответ W R O N G ** !!!!! См. Мой ответ для объяснения. –

+0

Я определенно не хочу читать спецификацию XPath. Но я вижу, что говорит Димитрий. '// img [1]' будет выбирать первый тег img * any * parent, а не первый из документа. –