4

ネストされたテーブルも含めずに、現在のノードの下にあるすべてのテーブルを見つけようとしています。言い換えれば、私がこれを持っている場合、私は「いいえ」ではなく「はい」を見つけたいと思います。

<table> <!-- outer table - no -->
  <tr><td>
    <div> <!-- *** context node *** -->
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
    </div>
  </td></tr>
</table>

XPath 1.0でこれを行う簡単な方法はありますか?(2.0ではそうなるでしょうが.//table except .//table//table、オプションとして2.0はありません。)

編集:お願いします、これまでの答えは現在のコンテキストノードの考えを尊重していません。テーブルの最初のレイヤーがどれだけ下にあるか(そしてそれは異なるかもしれません)、また別のテーブル(または2つまたは3つ)の中にいるかどうかもわかりません。

.//table except .//table//table文字通り、 XPath 2.0で何ができるかを知りたいのですが、XPath1しかありません。

4

5 に答える 5

0

私はあなたが子供が欲しいと思います::テーブル別名テーブル

#!/usr/bin/perl --
use strict;
use warnings;

use HTML::TreeBuilder;
{
  my $tree = HTML::TreeBuilder->new();

  $tree->parse(<<'__HTML__');
<table> <!-- outer table - no -->
  <tr><td>
    <div> <!-- *** context node *** -->
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
    </div>
  </td></tr>
</table>
__HTML__

  sub HTML::Element::addressx {
    return join(
      '/',
      '/', # // ROOT
      reverse(    # so it starts at the top
        map {
          my $n = $_->pindex() || '0';
          my $t = $_->tag;
          $t . '['. $n .']'
          }         # so that root's undef -> '0'
          $_[0],    # self and...
        $_[0]->lineage
      )
    );
  } ## end sub HTML::Element::addressx

  for my $td ( $tree->look_down( _tag => qr/div|table/i ) ) {
    print $td->addressx, "\n";
  }
  $tree->delete;
  undef $tree;
}
__END__
//html[0]/body[1]/table[0]
//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]
//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]/table[0]
//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]/table[0]/tr[0]/td[0]/table[0]
//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]/table[1]
//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]/table[1]/tr[0]/td[0]/table[0]

と第二部

#!/usr/bin/perl --

use strict;
use warnings;

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_content(<<'__HTML__');
<table> <!-- outer table - no -->
  <tr><td>
    <div> <!-- *** context node *** -->
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
      <table> <!-- yes -->
        <tr><td>
          <table> ... </table> <!-- no -->
        </td></tr>
      </table>
    </div>
  </td></tr>
</table>
__HTML__



#~ for my $result ($tree->findnodes(q{//html[0]/body[1]/table[0]/tr[0]/td[0]/div[0]})) {
for my $result ($tree->findnodes(q{/html/body/table/tr/td/div})) {
    print $result->as_HTML,"\n\n";
    for my $table( $result->findnodes(q{table}) ){ ## child::table
        print "$table\n";
        print $table->as_HTML,"\n\n\n";
    }

}

__END__
<div><table><tr><td><table><tr><td> ... </td></tr></table></td></tr></table><table><tr><td><table><tr><td> ... </td></tr></table></td></tr></table></div>


HTML::Element=HASH(0xc6c964)
<table><tr><td><table><tr><td> ... </td></tr></table></td></tr></table>



HTML::Element=HASH(0xc6cbf4)
<table><tr><td><table><tr><td> ... </td></tr></table></td></tr></table>
于 2010-01-13T18:16:33.697 に答える
0

まあ、私がそれを理解すれば、content_listは解決することができます:

my $table_one = $tree->findnodes('/html//table')->[1];

for ( $table_one->content_list ) {
    last if $_->exists('table');
    print $_->as_text;
}   

:)

于 2010-01-13T18:18:15.283 に答える
0

どう.//table[not(.//table)]ですか?簡潔に申し訳ありませんが、私は私の電話にいます。

于 2010-01-13T19:27:21.873 に答える
0

ネストされた述語でコンテキストノードを評価する方法はわかりませんが、必要なのは次のようなものです。

descendant::table[not(ancestor::table[ancestor::div])]

代わりに、コンテキストノードを参照する機能のみdiv

編集:コンテキストノードに変数を設定した場合、

<xsl:variable name="contextNode" select="." />

次に、XPATH述語でそれを参照できます。

descendant::table[not(ancestor::table[ancestor::*[generate-id(.)=generate-id($contextNode)]])]
于 2010-01-14T03:52:41.340 に答える
0

ここや他の場所で調査したところ、答えは「できないので、XPath2.0があるのはそのためです」と思われます。しかたがない。

于 2010-01-15T05:43:36.020 に答える