返回全文元素(包括子/后代元素)

时间:2011-10-29 17:24:07

标签: xpath nokogiri

我正在尝试从div / p页面上第一次出现的文本中获取文本,而只是第一个p。 < p>包含其他标签(< b>,< a href>)和来自< p>的返回文字停在任何其他标签。有没有办法让这一行返回< p>之间的所有文字?和< / p>,甚至在嵌入式标签之间?

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

2 个答案:

答案 0 :(得分:5)

使用

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

评估此XPath表达式时,结果是文档中第一个p的字符串值,该值是div的子项。

根据定义,元素的 string value 是其所有文本节点后代的连接(按文档顺序)。

因此,您可以获得以此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!

答案 1 :(得分:0)

使用Nokogiri作为更多XPath的替代方法,您可以使用Nokogiri::XML::Node#inner_text

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