質問編集履歴

6

「ノードの同一性」についての説明を追加しました.

2024/08/09 11:02

投稿

tmakita
tmakita

スコア70

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

前提条件を追加いたしました.

2024/08/09 06:08

投稿

tmakita
tmakita

スコア70

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

制約条件を明らかにしました.

2024/08/09 00:15

投稿

tmakita
tmakita

スコア70

test CHANGED
File without changes
test CHANGED
File without changes

3

制約条件を明らかにしました.

2024/08/09 00:15

投稿

tmakita
tmakita

スコア70

test CHANGED
File without changes
test CHANGED
File without changes

2

制約条件を明らかにしました.

2024/08/09 00:15

投稿

tmakita
tmakita

スコア70

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

関数プロトタイプを追加

2024/08/08 15:09

投稿

tmakita
tmakita

スコア70

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
  ### 試したこと・調べたこと