質問編集履歴
6
「ノードの同一性」についての説明を追加しました.
test
CHANGED
File without changes
|
test
CHANGED
@@ -63,4 +63,20 @@
|
|
63
63
|
<xsl:variable name="nodes2" as="node()+" select="($tree/*[3],$tree/*[2],$tree/*[1])" />
|
64
64
|
<xsl:variable name="nodes3" as="node()+" select="($tree/*[3],$tree/*[2],$tree/*[1],$tree/*[3])" />
|
65
65
|
```
|
66
|
+
同様に会社の同僚から「$nodes1と$nodes2の同一性」とは何か?と聞かれました、これは次のように考えることができます.
|
67
|
+
1. $nodes1のすべてのnode()の「node identity」が等しいnode()が$nodes2に存在し
|
68
|
+
2. 逆に$nodes2のすべてのnode()の「node identity」が等しいnode()が$nodes1に存在する
|
69
|
+
これが満たされることです.
|
66
70
|
|
71
|
+
node identity については以下に(むつかしいですが)定義があります.
|
72
|
+
[2.3 Node Identity](https://www.w3.org/TR/xpath-datamodel-31/#node-identity)
|
73
|
+
|
74
|
+
くだいていえば$node1と$node2(共に単一のnode())のnode identityが等しいとは、XSLT 1.0の以下の式が成り立つ場合と考えれば良いと思います.(これは独自解釈)
|
75
|
+
|
76
|
+
generate-id($node1) = generate-id($node2)
|
77
|
+
|
78
|
+
つまり$node1と$node2が同じツリーに属していて、ドキュメントオーダーで同じ位置にあればgenerate-id()は等しくなるはずです.
|
79
|
+
|
80
|
+
[14.5.4 fn:generate-id](https://www.w3.org/TR/xpath-functions-31/#func-generate-id)
|
81
|
+
|
82
|
+
> In other cases, the function returns a string that uniquely identifies a given node. More formally, it is guaranteed that within a single ·execution scope·, fn:codepoint-equal(fn:generate-id($N), fn:generate-id($M)) returns true if and only if ($M is $N) returns true.
|
5
前提条件を追加いたしました.
test
CHANGED
File without changes
|
test
CHANGED
@@ -49,4 +49,18 @@
|
|
49
49
|
調べましたが同じような質問はありませんでした.
|
50
50
|
|
51
51
|
### 補足
|
52
|
+
|
53
|
+
会社の同僚に同じ質問をしていて聞かれました.$nodes1, $nodes2に各々重複があった場合どう考えるのか?というもの.聞く方の立場からすれば、重複があった場合それを省いて比較していただければ良いです.例を示しますと.以下のような場合、$nodes1と$nodes2と$nodes3は「同じ」とみなしてもらって結構です.つまり重複を削除したノードの集合同士の比較ということになります.
|
54
|
+
|
55
|
+
```xml
|
56
|
+
<xsl:variable name="tree" as="document-node()" >
|
57
|
+
<xsl:document>
|
58
|
+
<a/><b/><c/><d/>
|
59
|
+
</xsl:document>
|
60
|
+
</xsl:variable>
|
61
|
+
|
62
|
+
<xsl:variable name="nodes1" as="node()+" select="($tree/*[1],$tree/*[2],$tree/*[3])" />
|
63
|
+
<xsl:variable name="nodes2" as="node()+" select="($tree/*[3],$tree/*[2],$tree/*[1])" />
|
64
|
+
<xsl:variable name="nodes3" as="node()+" select="($tree/*[3],$tree/*[2],$tree/*[1],$tree/*[3])" />
|
52
|
-
|
65
|
+
```
|
66
|
+
|
4
制約条件を明らかにしました.
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|
3
制約条件を明らかにしました.
test
CHANGED
File without changes
|
test
CHANGED
File without changes
|
2
制約条件を明らかにしました.
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
</xsl:otherwise>
|
17
17
|
</xsl:choose>
|
18
18
|
```
|
19
|
-
では、次のような場合、$nodes1と$nodes2の同一性は、どんな関数(xsl:function)をつくれば得ることができるでしょう.
|
19
|
+
では、次のような場合、$nodes1と$nodes2の同一性は、どんな関数(xsl:function)をつくれば得ることができるでしょう.$nodes1, $nodes2とも並びはドキュメントオーダーが保証されていないものとします.
|
20
20
|
```xml
|
21
21
|
<!--"~"は適当なXPath式を示します-->
|
22
22
|
<xsl:variable name="nodes1" as="node()*" select="~"/>
|
1
関数プロトタイプを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -23,13 +23,20 @@
|
|
23
23
|
<xsl:variable name="nodes2" as="node()*" select="~"/>
|
24
24
|
```
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
26
|
### 該当のソースコード
|
30
27
|
|
28
|
+
こんな関数になると思います.
|
29
|
+
|
31
|
-
```
|
30
|
+
```xml
|
31
|
+
<!--望まれる関数のインタフェース、ネームスペースは適当です-->
|
32
|
+
<xsl:function name="ahf:compareNodes" as="xs:boolean">
|
33
|
+
<xsl:param name="prmNodes1" as="node()*"/>
|
34
|
+
<xsl:param name="prmNodes2" as="node()*"/>
|
35
|
+
<!--関数のコード本体-->
|
36
|
+
<!-- $prmNodes1と$prmNodes2の同一性を判定して
|
37
|
+
結果をtrue()かfalse()で返す
|
32
|
-
|
38
|
+
-->
|
39
|
+
</xsl:function>
|
33
40
|
```
|
34
41
|
|
35
42
|
### 試したこと・調べたこと
|