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 に答える