38466


例えば以下のようなXPathがあった場合

[code]

    "parent::node()/parent::*/@outputclass"
    "parent::*/parent::*/@outputclass"
    
[/code]

node() と * の指定の違いによって  
XPathの結果にどのような違いが出てくるのでしょうか？


CC BY-SA 3.0
2017-10-04T08:18:35.253
38420
2017-10-05T14:10:57.380
2017-10-04T13:48:22.697
76
25399
question
xpath
XPathにおけるnode()と*の違い


以下、`XPath`仕様書 [XML Path Language (XPath)](https://www.w3.org/TR/xpath/)
からの引用です。

  * `child::node()` selects all the children of the context node, whatever their node type
  * `child::*` selects all element children of the context node

`node()`は`element`、`text()`、`comment()`などの全ての種類のノードにマッチし、`*`は`element`ノードにのみマッチします。

参考: [templates - Difference between * and node() in XSLT - Stack
Overflow](https://stackoverflow.com/questions/12071402/difference-between-and-
node-in-xslt)


CC BY-SA 3.0
2017-10-04T11:00:41.470
38428
2017-10-04T11:00:41.470
46
38420
answer


質問の２つのXPathの違いは、`parent::node()`と`parent::*`です．この２つの返すものの違いを説明すれば、それ以降の`parent::*/@outputclass`の結果はそこから自動的に導かれます．この考えに沿って回答を記述します．

まず質問にはコンテキストノードが何か？の条件が前提として記述されていません．XML文書では、parent軸で参照されるノードは、存在しないか、ドキュメントノードもしくは要素ノード以外にはありません．従ってコンテキストノードが何かにより`parent::node()`が返すものは異なります．

これに対して`parent::*`は、親ノードが要素ノードである場合はそれを返し、ドキュメントノードもしくは存在しない場合は空シーケンスを返します．

さて`parent::node()`が何を返すかは、コンテキストノードが何であるかにより以下のパターンとなるでしょう．

  1. `self::text()`、`self::processing-instruction()`もしくは`self::comment()`の場合

コンテキストノードがドキュメントノードの子ノードの場合、ドキュメントノードを返します．それ以外の場合は親の要素ノードを返します．

  2. `self::element()`の場合

コンテキストノードがドキュメントノードの子ノードの場合（つまりルート要素の場合）、ドキュメントノードを返します．それ以外の場合は親の要素ノードを返します．

  3. `self::attribute()`、`self::namespace-node()`の場合

親の要素ノードを返します．

  4. `self::document-node()`の場合

空シーケンスを返します．

※ ネームスペース軸はXPath
2.0からdeprecatedとなりましたが、Saxonで試したところ`namespace::node()`で参照できたためカレントコンテキストになり得るものとして扱いました．


CC BY-SA 3.0
2017-10-05T14:10:57.380
38466
2017-10-05T14:10:57.380
9503
38420
answer