如何从段落中获取文本而不包含来自某个子元素Nokogiri的文本

时间:2016-12-14 14:27:46

标签: ruby xpath nokogiri

<w:p>
    <w:r>
        <w:t>The table predicted, with </w:t>
    </w:r>
    <w:ins w:author="RKH RKH" w:date="2016-11-06T17:53:00Z" w:id="0">
        <w:r>
            <w:t>impressive</w:t>
        </w:r>
    </w:ins>
    <w:del w:author="RKH RKH" w:date="2016-11-06T17:53:00Z" w:id="1">
        <w:r w:rsidDel="001F31B2" w:rsidRPr="001F31B2">
            <w:delText>stunning</w:delText>
        </w:r>
    </w:del>
 </w:p>
<w:p>
    <w:r>
        <w:t>The man started </w:t>
    </w:r>
    <w:ins w:author="RKH RKH" w:date="2016-11-06T17:53:00Z" w:id="0">
        <w:r>
            <w:t>to run.</w:t>
        </w:r>
    </w:ins>
    <w:del w:author="RKH RKH" w:date="2016-11-06T17:53:00Z" w:id="1">
        <w:r w:rsidDel="001F31B2" w:rsidRPr="001F31B2">
            <w:delText>to hike.</w:delText>
        </w:r>
    </w:del>
 </w:p>

我得到如下段落并循环遍历它们。

@all_paragraph_nodes = @file.xpath('//w:p')

@all_paragraph_nodes.each_with_index do |p, index|
...

我想从循环中的每个段落中获取文本,不包括<w:del>元素内的文本。

我怎么能用Nokogiri做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以选择w:p的所有子元素,然后使用带有not()name()的谓词来过滤掉w:del元素。

@all_paragraph_nodes.each_with_index do |p, index|
  text_nodes = p.xpath("*[not(name(.)='w:del')]//text()")
  # ... process however you want
end

您可能需要删除空文本节点。您可以在Ruby中执行此操作,也可以使用normalize-space()

在XPath中过滤掉它们
p.xpath("*[not(name(.)='w:del')]//text()[normalize-space()]")