我正在尝试从div / p页面上第一次出现的文本中获取文本,而只是第一个p。 < p>包含其他标签(< b>,< a href>)和来自< p>的返回文字停在任何其他标签。有没有办法让这一行返回< p>之间的所有文字?和< / p>,甚至在嵌入式标签之间?
puts doc.xpath('html/body/div/p[1]/text()').first
答案 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