* MSXML XPath - [20] [CODE(DOMm)@en[[[selectNodes]]]] - [21] [CODE(DOMm)@en[[[selectSingleNode]]]] [15] [CITE[IRC logs: freenode / #whatwg / 20101008]] ( ([TIME[2010-10-22 22:12:03 +09:00]] 版)) * DOM3 XPath - [24] [CODE(DOMi)@en[[[XPathNSResolver]]]] [1] [CITE[Introduction to using XPath in JavaScript - MDC]] ([[名無しさん]]) [2] [CITE[Latest topics > getElementsByなんちゃら の代わりにXPathを使う - outsider reflex]] ([[Piro(SHIMODA Hiroshi)]] 著, [CODE[2007-09-09 11:44:24 +09:00]] 版) ([[名無しさん]]) [3] [CITE@en[SourceForge.net: XPath over HTML for MSIE]] ([CODE[2007-10-06 15:19:21 +09:00]] 版) ([[名無しさん]]) [4] [CITE@ja[Safari 3 の XPath のバグ: Days on the Moon]] ([CODE[2008-05-11 15:36:16 +09:00]] 版) ([[名無しさん]]) [5] [CITE@ja[選択範囲のリンクを取得する: Days on the Moon]] ([CODE[2008-10-19 11:34:21 +09:00]] 版) ([[名無しさん]]) [6] [CITE[XPath は実用に耐えうるかの考察と xpath.js - IT戦記]] ([CODE[2008-10-31 22:50:48 +09:00]] 版) ([[名無しさん]]) [7] [CITE[HTML 用の XPath 機能テストを書いた - IT戦記]] ([TIME[2008-10-31 23:00:27 +09:00]] 版) [8] [CITE[JavaScript-XPath をリリースしました!さあ、あなたも XPath を使おう!(解説付き) - IT戦記]] ([TIME[2009-02-02 02:01:53 +09:00]] 版) [9] [CITE[JavaScript-XPath – CodeRepos::Share – Trac]] ([TIME[2009-02-02 11:11:12 +09:00]] 版) [10] [CITE[はてなブックマークのコンテンツの JavaScript を高速化する - IT戦記]] ([TIME[2009-02-08 18:51:12 +09:00]] 版) [11] [CITE@ja[XPath, $X function, NSResolver < 16 < March < 2006 < nulog, NULL::something : out of the headphone]] ([TIME[2009-02-01 19:18:32 +09:00]] 版) [12] [CITE@ja[Kanasan.JS Greasemonkey チュートリアル読書会: Days on the Moon]] ([TIME[2009-03-23 00:03:31 +09:00]] 版) >document.evaluate メソッドの返り値である XPathResult オブジェクトを、別の evaluate メソッドの呼び出し時に第5引数として渡すと、その XPathResult オブジェクトが再利用されます。しかし、「再利用される」とは具体的にどうなることかという説明は DOM 3 XPath 仕様中になく、そもそも "'''may''' be reused" (強調は筆者による) なので確実に再利用されるという保証もありません。Firefox (Gecko) と Opera では第 5 引数に渡したオブジェクトが返り値となりますが、Safari (WebKit) では常に新しいオブジェクトを生成して返すようです。ちなみに Firefox では第 5 引数を指定すると意図しない結果になることがあります。 > [PRE(JS example code)[ var result = document.evaluate("'foo'", document, null, XPathResult.STRING_TYPE, null); document.evaluate("'bar'", document, null, XPathResult.STRING_TYPE, result); result.stringValue; // Firefox 3.6a1pre => "foobar" ("bar" を期待していたのに!) // Opera 9.64 => "bar" // Safari 3.1.2 => "foo" ]PRE] > XPathResult には結果の型として順序付きのもの (ORDERED_NODE_ITERATOR_TYPE、ORDERED_NODE_SNAPSHOT_TYPE、FIRST_ORDERED_NODE_TYPE) と順序なしのもの (UNORDERED_NODE_ITERATOR_TYPE、UNORDERED_NODE_SNAPSHOT_TYPE、ANY_UNORDERED_NODE_TYPE) があります。ソースコードを見る限り、WebKit では順序付きかどうかで処理を分けていますが、Gecko では順序なしでも順序付きと同等に扱っているようです。 [16] [CITE@en[DOM XPath - WHATWG Wiki]] ( ([TIME[2012-04-10 18:16:04 +09:00]] 版)) [17] [CITE@en-US[Document Object Model (DOM) Level 3 XPath Specification]] ( ([TIME[2004-02-23 21:49:04 +09:00]] 版)) [18] [CITE@en-US[Document Object Model (DOM) Level 3 XPath Specification]] ( ([TIME[2004-02-23 21:49:04 +09:00]] 版)) [19] [CITE@en-US[Document Object Model (DOM) Requirements]] ( ([TIME[2004-02-23 21:14:24 +09:00]] 版)) [23] [[Firefox]] は [CODE(JS)@en[[[document.evaluate]]]] の引数を省略できません。 [[Chrome]] では最初の2つ以外は省略できます。 [TIME[2013-09-25T13:45:03.600Z]] * XPath と HTML [13] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-09-29 08:53:48 +09:00]] 版) [14] [CITE[Bug 7059 – Forking XPath]] ([TIME[2009-09-29 08:57:42 +09:00]] 版) [22] [[Firefox]] も [[Chrome]] も、[[既定名前空間]]については [CODE(DOMi)@en[[[NSResolver]]]] を呼び出しません (仕様通りの動作)。 [[HTML文書]]では[[既定名前空間]]の[[名前テスト]]は[[HTML名前空間]]の[[要素]]と[[一致]]します。 [[Firefox]] では更に [[null名前空間]]の[[要素]]とも[[一致]]します。 [[XML文書]]では [[Firefox]] も [[Chrome]] も[[null名前空間]]の[[要素]]とだけ[[一致]]します。どちらの場合もその他の[[名前空間]]とは[[一致]]しません。 [TIME[2013-09-25T13:37:24.800Z]] * 構文解析 [26] [CODE(DOMi)@en[[[XPathNSResolver]]]] の項も参照。 [25] [[Firefox]] は[[関数名]]の[[名前空間接頭辞]]を[[解決]]した上で、未対応の[[関数]]があれば構文解析エラーとします。 [[Chrome]] は[[関数]]の[[名前空間接頭辞]]を[[解決]]せず、未対応の[[関数]]があれば構文解析エラーとします。 [TIME[2013-09-28T12:41:21.100Z]] [28] [[Firefox]] は[[関数]]の[[引数]]の個数チェックを[[評価]]時に行っているようですが、 [[Chrome]] は[[構文解析]]時に行っているようです。 [TIME[2013-09-28T13:10:47.700Z]] [29] [[Firefox]] も [[Chrome]] も[[引数]]の型チェックは[[構文解析]]時ではなく[[評価]]時に行っているようです。 例えば [CODE[count(12)]] は構文解析エラーになりませんが評価時に例外が投げられます。 [CODE[[[|]]]] [[演算子]]も同様です。 [TIME[2013-09-29T02:02:23.100Z]] [27] [[Firefox]] は[[変数]]が入った[[式]]を構文解析できますが、評価時に [CODE[[[NS_ERROR_ILLEGAL_VALUE]]]] [[例外]]が発生します。なので [CODE(DOMm)@en[[[createExpression]]]] は成功しますが [CODE(JS)@en[[[document.evaluate]]]] は[[例外]]を投げます。 [[Chrome]] は[[変数]]に[[名前空間接頭辞]]があると [CODE(DOM)@en[[[SyntaxError]]]] になります。[[名前空間接頭辞]]がなければ[[評価]]も成功します ([[空文字列]]になるようです)。 [TIME[2013-09-28T12:46:45.400Z]] [30] [CITE[Introduction to DOM XPath - DOM ECMAScripting]] ( ([TIME[2012-02-18 20:10:31 +09:00]] 版))