XPath test #3

コメントノード、怪しくなかった。TreeBuilderのstore_comments呼んでなかっただけ。pi系の関数はたぶん実装されてないだけなんじゃないだろうか。descendantはやっぱりあやしいのかも。substringの引数は文字列しか想定してないとみた。
substringの二番目の引数で示される開始位置が文字列より長いとperlのsubstrが文句言ってる。でもXML Path Language (XPath)にもその場合について書いてない。Firefoxの実装は空文字列返してるけど。

descendantはバグだ。axisが逆になってるみたい。
逆にいえばほかはみんなamachangのテストを通る。使い方が間違ってただけでHTML::TreeBuilder::XPathはかなりいい(んだと思う。あとでためそっと)。


*ng .//blockquote/descendant::*
        expected: ins
        result  : br p del ins font
*ng (.//blockquote/descendant::*)
        expected: ins
        result  : br p del ins font
*ng (.//blockquote/descendant::*)[4]
        expected: ins
        result  : p
my $tree = HTML::TreeBuilder::XPath->new;
$tree->store_comments(1);
$tree->store_pis(1);
$tree->parse($html);

めちゃくちゃだけどこれでok.

    my $literal;
    if ( $results->isa('XML::XPathEngine::Number') ) {
        $literal = $results->string_value;
    } elsif ( $results->isa('XML::XPathEngine::Literal') ) {
        $literal = $results->string_value;
    } else {
        $literal = eval {
            join " ", map {
                $lastOne = $_ ;

                if ( $_->isa('HTML::TreeBuilder::XPath::TextNode') ) {
                        't:' . $_->getValue;
                } elsif ($_->isa('HTML::Element') )  {
                    if ( $_->isCommentNode ) {
                        'c:' . $_->{text};
                    } elsif ( $_->isProcessingInstructionNode ){
                        'p:' . substr($_->tag, 1);
                    } else {
                        $_->tag;
                    }
                } else {
                    die;
                }

            } @$results;
        };
    }
*ng .//blockquote/processing-instruction()
        expected: p:pi
        result  :
*ng .//blockquote/processing-instruction("pi")
        expected: p:pi
        result  :
*ng .//blockquote/descendant::*[position() < 4]
        expected: br p del
        result  : br del ins
*xpath evaluation failed. id(.//font/@face)
Can't locate object method "look_down" via package "HTML::TreeBuilder::XPath::Attribute" at /Library/Perl/5.8.6/HTML/TreeBuilder/XPath.pm line 34.

*ng .//blockquote/descendant::*[4]
        expected: ins
        result  : p
*ng .//blockquote/descendant-or-self::*[4]
        expected: del
        result  : p
*ng .//blockquote/preceding::*[4]
        expected: strong
        result  : h1
*xpath evaluation failed. .//*[substring(.,2,1) = "u"]
substr outside of string at /Library/Perl/5.8.6/XML/XPathEngine/Function.pm line 248.

*xpath evaluation failed. .//*[substring(.,2) = "up"]
substr outside of string at /Library/Perl/5.8.6/XML/XPathEngine/Function.pm line 251.

*xpath evaluation failed. .//*[lang("it")]
axis axis_attribute not implemented [Can't locate object method "getNamespace" via package "HTML::TreeBuilder::XPath::Attribute" at /Library/Perl/5.8.6/XML/XPathEngine.pm line 182.
]