回答編集履歴

2

a

2016/04/10 01:31

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -3,3 +3,71 @@
3
3
 
4
4
 
5
5
  リテラルを分割してXPathの`concat`関数で結合する,という方法があるようです.但し分割パートが1つとなってしまった場合にエラーになるので,`concat`関数の引数が必ず2つ以上になるように空文字列のリテラルを渡す必要があります.
6
+
7
+
8
+
9
+ ```html
10
+
11
+ <ul id="sample">
12
+
13
+ <li>test</li>
14
+
15
+ <li>"hoge"</li>
16
+
17
+ <li>'foo'</li>
18
+
19
+ <li>"piyo'</li>
20
+
21
+ </ul>
22
+
23
+ <script>
24
+
25
+ 'use strict';
26
+
27
+
28
+
29
+ function xPathLiteralize(str) {
30
+
31
+ var r = "concat('" + String(str).replace(/'/g, "', \"'\", '") + "', '')";
32
+
33
+ console.log(r); // just for debugging
34
+
35
+ return r;
36
+
37
+ }
38
+
39
+
40
+
41
+ function getFirstTextNode (contextNode, string) {
42
+
43
+ return document.evaluate(
44
+
45
+ 'descendant::text()[.=' + xPathLiteralize(string) + ']',
46
+
47
+ ul,
48
+
49
+ null,
50
+
51
+ XPathResult.FIRST_ORDERED_NODE_TYPE,
52
+
53
+ null
54
+
55
+ ).singleNodeValue;
56
+
57
+ }
58
+
59
+
60
+
61
+ var ul = document.getElementById('sample');
62
+
63
+ console.log(getFirstTextNode(ul, 'test'));
64
+
65
+ console.log(getFirstTextNode(ul, '"hoge"'));
66
+
67
+ console.log(getFirstTextNode(ul, "'foo'"));
68
+
69
+ console.log(getFirstTextNode(ul, '"piyo\''));
70
+
71
+ </script>
72
+
73
+ ```

1

a

2016/04/10 01:30

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- リテラルを分割してXPathの`concat`関数で結合する,という方法があるようです.
5
+ リテラルを分割してXPathの`concat`関数で結合する,という方法があるようです.但し分割パートが1つとなってしまった場合にエラーになるので,`concat`関数の引数が必ず2つ以上になるように空文字列のリテラルを渡す必要があります.