1

xmlns我在根目录中有以下代码示例:

<ol class="stan">
    <li>Item one.</li>
    <li>
        <p>Paragraph one.</p>
        <p>Paragraph two.</p>
    </li>
    <li>
        <pre>Preformated one.</pre>
        <p>Paragraph one.</p>
    </li>
</ol>

我想对第一个项目执行不同的操作,<li>具体取决于它所在的标签类型,或者没有标签,即<li>样本中的第一个。


编辑:

我追求任务的逻辑被证明是不正确的。

  1. 如何查询<li>没有后代的第一个列表项?

我试过否定:

@doc.xpath("//xmlns:ol[@class='stan']//xmlns:li/xmlns:*[1][not(p|pre)]")

这与我认为我所要求的完全相反。

我想我让表达变得更加复杂,因为我找不到正确的解决方案。


更新:

Navin Rawat 在评论中回答了这个问题。正确的代码是:

@doc.xpath("//xmlns:ol[@class='stan']/xmlns:li[not(xmlns:*)]")

更正:

正确的问题涉及 XPath 搜索和 Nokogiri 方法。

给定上面的xhtml代码,我如何使用 搜索第一个后代xpath?以及如何xpath在条件语句中使用,例如:

@doc.xpath("//xmlns:ol[@class='stan']/xmlns:li").each do |e|
    if e.xpath("e has no descendants")
        perform task
    elsif e.xpath("e first descendant is <p>")
        perform second task
    elsif e.xpath("e first descendant is <pre>")
        perform third task
    end
end

我不是要完整的代码。Nokogiri只是上面代码中括号中的部分。

4

1 回答 1

1

纯 XPath 答案...

如果您有以下 XML :

<ol class="stan">
    <li>Item one.</li>
    <li>
        <p>Paragraph one.</p>
        <p>Paragraph two.</p>
    </li>
    <li>
        <pre>Preformated one.</pre>
        <p>Paragraph one.</p>
    </li>
</ol>

并且想要选择 <li>没有子元素的第一个列表项,请使用:

//ol/li[count(*)=0]

如果您有命名空间问题,请提供整个 XML(带有根元素和命名空间声明),以便我们帮助您处理它。

在我们讨论后编辑,这是您最终测试的代码:):

@doc.xpath("//xmlns:ol[@class='footnotes']/xmlns:li").each do |e|
  if e.xpath("count(*)=0")
    puts "No children"
  elsif e.xpath("count(*[1]/self::xmlns:p)=1")
    puts "First child is <p>"
  elsif e.xpath("count(*[1]/self::xmlns:pre)=1")
    puts "First child is <pre>"
  end
end
于 2013-05-07T09:28:34.300 回答