Возврат полного текстового элемента (включая дочерние / дочерние элементы) - PullRequest
3 голосов
/ 29 октября 2011

Я пытаюсь получить текст из первого вхождения на странице div / p и только из первого p.

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

, даже между встроенными тегами?
puts doc.xpath('html/body/div/p[1]/text()').first

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

Используйте

string((//div/p)[1])

Когда вычисляется это выражение XPath, результатом является строковое значение первого p в документе, который является потомком div.

По определению строковое значение элемента является объединением (в порядке документа) всех его потомков текстовых узлов.

Таким образом, вы получите ровно весь текст в поддереве с корнем этого элемента p, а все остальные узлы (элементы, комментарии, PI) будут пропущены.

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select="string(p)"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML (такого не предусмотрено!):

<p>
 Hello <b>
  <a href="http://www.w3.org/TR/2008/REC-xml-20081126/">XML</a>
   World!</b>
</p>

результат вычисленного выражения XPath выводится :

 Hello XML
   World!
0 голосов
/ 31 октября 2011

Используя Nokogiri в качестве альтернативы для большего количества XPath, вы можете использовать Nokogiri::XML::Node#inner_text:

puts doc.xpath('html/body/div/p[1]').inner_text
...