開発^3

Web開発、宇宙開発、ゲーム開発の3種類についてつらつらと

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>