2016-09-30 25 views
0

DOMXPathオブジェクトとevaluate()関数を使用して入力XPathをevaluate()にしようとしています。しかし、予期せぬ結果が出ています。この例では、2つのXPath構造は、無効なもので比較される@beginを除いて、ほぼ同じです。私はなぜこのコードが無効であるのか分からない。DOMXPath-> evaluate()がfalseを返すのはなぜですか?

<?php 

$newDomObj = new DOMDocument; 
$newXpathObj = new DOMXPath($newDomObj); 

$xpathValid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw"] and node[@rel="hd" and @pt="ww"] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid"] and node[@rel="hd" and @pt="n"]]]'; 
$xpathInvalid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw" and number(@begin) < ../node[@rel="hd" and @pt="ww"]/number(@begin)] and node[@rel="hd" and @pt="ww" and number(@begin) < ../node[@rel="predc" and @cat="np"]/node[@rel="det" and @pt="lid"]/number(@begin)] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid" and number(@begin) < ../node[@rel="hd" and @pt="n"]/number(@begin)] and node[@rel="hd" and @pt="n"]]]'; 

$valid = ($newXpathObj->evaluate($xpathValid) === false) ? false : true; 
$invalid = ($newXpathObj->evaluate($xpathInvalid) === false) ? false : true; 

var_dump($valid); 
var_dump($invalid); 

出力

bool(true) 
bool(false) 

(より良いあなたがmy beautifierを使用することができます与えられたXPath構造を検査するために、注意してください - 。免責事項、私はそのツールの作者だあなたは上記のPHPコードhereをテストすることができます。 )

私のXPathについて何が間違っているのですか、それとも間違った方法で評価していますか?この種のXPathをどのように評価できますか?

+0

これを実行すると、 '警告:DOMXPath :: evaluate():無効なe .......... 13行目のxpression。しかし、あなたの '$ xpathValid = 'count(row/entry [。=" en "])'; 'を変更した場合、私は:' float(0) ' –

+0

@Anantそれを実行します[http: /ideone.com/aVSX3G)。 –

+0

ここにも警告が表示されます、BTW: - https://eval.in/653162。 –

答えて

0

あなたの第二のXPathの以下の部分はsupports-をパスステップで関数を呼び出すサポートしていません-which DOMXPath XPath 1.0のために、有効ではないためです。

../node[@rel="hd" and @pt="n"]/number(@begin)] 

../node[@rel="hd" and @pt="n"]が常に返すことが保証されている場合多くても1つの結果が返される場合や、複数のアイテムが返された場合に最初のアイテムと比較する必要がある場合は、次の式を代わりに使用することができます。

number(../node[@rel="hd" and @pt="n"]/@begin) 
+0

ああ;それは理にかなっている。このバージョンのXPathはサポートされていますか? 2.0? –

+0

@BramVanroyはい、2.0から開始します。確認するには、[This](http://www.xpathtester.com/xpath)、[this](http://xpatheval.apphb)などXPath 1.0以上をサポートするツールでXPathをテストできます.com /) – har07

+0

ありがとうございます。 XPathは自動的に生成され、人間のインタラクタによって編集されるので、私はその有効性を確認する必要があります。 PHPでXPath 2.0を検証するためのメソッドを探し続けます。 –

関連する問題