descendant-or-selfと//は完全に同一じゃないらしい
てっきりdescendant-or-self == //だと思っていたんだけど、contextNodeとしてルート以外を指定した場合には異なるらしい。
結果をみた感じ、「//」を指定するとcontextNodeとは関係なくルートから検索するのかね。
contextNodeから下で探したいのであれば、descendant-or-selfまたは「.//」を使うのが良いみたい。
XPath | contextNode | 結果件数 |
---|---|---|
descendant-or-self | root | 2件 |
.// | root | 2件 |
// | root | 2件 |
descendant-or-self | content1 | 1件 |
.// | content1 | 1件 |
// | content1 | 2件 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script type="text/javascript"> <!-- function xpathsample() { var content1 = document.getElementById("content1"); var xpath1 = "descendant-or-self::p"; var xpath2 = ".//p"; var xpath3 = "//p"; alert(document.evaluate(xpath1, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 2 alert(document.evaluate(xpath2, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 2 alert(document.evaluate(xpath3, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 2 alert(document.evaluate(xpath1, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 1 alert(document.evaluate(xpath2, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 1 alert(document.evaluate(xpath3, content1, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength); // 2 } //--> </script> </head> <body> <div id="content1"> <div> <p>content1</p> </div> </div> <div id="content2"> <div> <p>content2</p> </div> </div> <input type="button" onclick="xpathsample()" value="sample"> </body> </html>