39708


初歩的なことで教えてください．仕様と言われればそれまでですが、表題の両者はなぜ違うのでしょう？

パターンの`node()`

<https://www.w3.org/TR/xslt-30/#patterns>

> node() matches any node other than an attribute node, namespace node, or
> document node.

ノードテストの`node()`

<https://www.w3.org/TR/xpath-31/#doc-xpath31-NodeTest>

> node() matches any node.

これは次のようなスタイルシートで確認できます．

［入力XML］

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <doc xmlns:my-prefix="http://my.com/namespace">
        <title>Document title</title>
        <chapter toc="yes">
            <!-- これはコメントです-->
            <?pi これは処理命令です． ?>
            <p>The quick brown fox jumps over the lazy dog</p>        
        </chapter>
        <my-prefix:h1>これは名前空間"http://my.com/namespace"に属した要素のテキストです</my-prefix:h1>
    </doc>
    
[/code]

［スタイルシート］

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="3.0">
    
        <xsl:output method="text" encoding="UTF-8" byte-order-mark="yes"/>
    
        <xsl:template match="node()|attribute()|document-node()|namespace-node()">
            <xsl:if test="self::node()">
                <xsl:value-of select="'generate-id:',generate-id(),'ともかくノードです！','&#x0A;'"/>
            </xsl:if>
            <xsl:choose>
                <xsl:when test="self::document-node()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:ドキュメントノード','&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::element()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:要素ノード','要素名:',name(),'ネームスペースURI:',namespace-uri(),'&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::attribute()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:属性ノード','属性名:',name(),'属性値:',string(.),'ネームスペースURI:',namespace-uri(),'&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::text()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:テキストノード','テキスト:',string(.),'&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::comment()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:コメントノード','コメント:',string(.),'&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::processing-instruction()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:処理命令ノード','名前:',name(),'値',string(.),'&#x0A;'"/>
                </xsl:when>
                <xsl:when test="self::namespace-node()">
                    <xsl:value-of select="'generate-id:',generate-id(),'ノード種別:ネームスペースノード','名前:',name(),'値',string(.),'&#x0A;'"/>
                </xsl:when>
            </xsl:choose>
            <xsl:apply-templates select="node()|attribute::node()|namespace::node()"/>
        </xsl:template>
    
    </xsl:stylesheet>
    
[/code]

［出力テキスト］

[code]

    generate-id: d1 ともかくノードです！ 
    generate-id: d1 ノード種別:ドキュメントノード 
    generate-id: d1e1 ともかくノードです！ 
    generate-id: d1e1 ノード種別:要素ノード 要素名: doc ネームスペースURI:  
    generate-id: d1e1n0 ともかくノードです！ 
    generate-id: d1e1n0 ノード種別:ネームスペースノード 名前: my-prefix 値 http://my.com/namespace 
    generate-id: d1e1n1 ともかくノードです！ 
    generate-id: d1e1n1 ノード種別:ネームスペースノード 名前: xml 値 http://www.w3.org/XML/1998/namespace 
    generate-id: d1t2 ともかくノードです！ 
    generate-id: d1t2 ノード種別:テキストノード テキスト: 
    
    generate-id: d1e3 ともかくノードです！ 
    generate-id: d1e3 ノード種別:要素ノード 要素名: title ネームスペースURI:  
    generate-id: d1e3n0 ともかくノードです！ 
    generate-id: d1e3n0 ノード種別:ネームスペースノード 名前: my-prefix 値 http://my.com/namespace 
    generate-id: d1e3n1 ともかくノードです！ 
    generate-id: d1e3n1 ノード種別:ネームスペースノード 名前: xml 値 http://www.w3.org/XML/1998/namespace 
    generate-id: d1t4 ともかくノードです！ 
    generate-id: d1t4 ノード種別:テキストノード テキスト: Document title 
    generate-id: d1t5 ともかくノードです！ 
    generate-id: d1t5 ノード種別:テキストノード テキスト: 
    
    generate-id: d1e6 ともかくノードです！ 
    generate-id: d1e6 ノード種別:要素ノード 要素名: chapter ネームスペースURI:  
    generate-id: d1e6n0 ともかくノードです！ 
    generate-id: d1e6n0 ノード種別:ネームスペースノード 名前: my-prefix 値 http://my.com/namespace 
    generate-id: d1e6n1 ともかくノードです！ 
    generate-id: d1e6n1 ノード種別:ネームスペースノード 名前: xml 値 http://www.w3.org/XML/1998/namespace 
    generate-id: d1e6a1027 ともかくノードです！ 
    generate-id: d1e6a1027 ノード種別:属性ノード 属性名: toc 属性値: yes ネームスペースURI:  
    generate-id: d1t7 ともかくノードです！ 
    generate-id: d1t7 ノード種別:テキストノード テキスト: 
    
    generate-id: d1c8 ともかくノードです！ 
    generate-id: d1c8 ノード種別:コメントノード コメント:  これはコメントです 
    generate-id: d1t9 ともかくノードです！ 
    generate-id: d1t9 ノード種別:テキストノード テキスト: 
    
    generate-id: d1p10 ともかくノードです！ 
    generate-id: d1p10 ノード種別:処理命令ノード 名前: pi 値 これは処理命令です．  
    generate-id: d1t11 ともかくノードです！ 
    generate-id: d1t11 ノード種別:テキストノード テキスト: 
    
    generate-id: d1e12 ともかくノードです！ 
    generate-id: d1e12 ノード種別:要素ノード 要素名: p ネームスペースURI:  
    generate-id: d1e12n0 ともかくノードです！ 
    generate-id: d1e12n0 ノード種別:ネームスペースノード 名前: my-prefix 値 http://my.com/namespace 
    generate-id: d1e12n1 ともかくノードです！ 
    generate-id: d1e12n1 ノード種別:ネームスペースノード 名前: xml 値 http://www.w3.org/XML/1998/namespace 
    generate-id: d1t13 ともかくノードです！ 
    generate-id: d1t13 ノード種別:テキストノード テキスト: The quick brown fox jumps over the lazy dog 
    generate-id: d1t14 ともかくノードです！ 
    generate-id: d1t14 ノード種別:テキストノード テキスト:         
    
    generate-id: d1t15 ともかくノードです！ 
    generate-id: d1t15 ノード種別:テキストノード テキスト: 
    
    generate-id: d1e16 ともかくノードです！ 
    generate-id: d1e16 ノード種別:要素ノード 要素名: my-prefix:h1 ネームスペースURI: http://my.com/namespace 
    generate-id: d1e16n0 ともかくノードです！ 
    generate-id: d1e16n0 ノード種別:ネームスペースノード 名前: my-prefix 値 http://my.com/namespace 
    generate-id: d1e16n1 ともかくノードです！ 
    generate-id: d1e16n1 ノード種別:ネームスペースノード 名前: xml 値 http://www.w3.org/XML/1998/namespace 
    generate-id: d1t17 ともかくノードです！ 
    generate-id: d1t17 ノード種別:テキストノード テキスト: これは名前空間"http://my.com/namespace"に属した要素のテキストです 
    generate-id: d1t18 ともかくノードです！ 
    generate-id: d1t18 ノード種別:テキストノード テキスト: 
    
[/code]

以上 よろしくお願いいたします．


CC BY-SA 3.0
2017-11-15T08:36:47.560
39595
2017-11-20T05:49:54.660
9503
question
xml xpath xslt
パターンのnode()とノードテストのnode()の違い


以下のようなことであって、`node()` 自体に違いは無いのではないでしょうか。

  * `instance of node()` 的に使うとき、`node()` はすべての node を指す。
  * `./node()` 的に使うときも、`node()` 自体はやはりすべての node を指す。ただし、このときの implicit な axis を explicit にすると `child::node()` なので、attribute, namespace, document node は、定義上誰の child でもないがゆえに、除外される。


CC BY-SA 3.0
2017-11-17T14:16:26.077
39659
2017-11-17T14:16:26.077
26245
39595
answer


そもそも XSLT pattern に話を限る必要はないのでは？、ということです。  
XPath の path expression でも `node()` は `child::node()` ですよね：

[3.3.5 Abbreviated Syntax](http://www.w3.org/TR/xpath-30/#abbrev)

>   2. If the axis name is omitted from an axis step, the default axis is
> child ...
>

あえて「XSLTの勧告」に話を限るとしても、pattern が XPath と異なる方向へ施す調整において、implicit な axis
について結局上記を参照しているのでは：

[5.5.3 The Meaning of a Pattern](http://www.w3.org/TR/xslt-30/#pattern-
semantics)

> ... The adjustment depends on the axis used in this step, whether it appears
> explicitly or implicitly (according to the rules of Section 3.3.5
> Abbreviated Syntax XP30) ...

* * *

もっとも、私のような一般人にとっては「勧告」はどうでもよくて、『XSLT 2.0 and XPath 2.0 Programmer's
Reference』に

  * > you might expect the pattern «node()» to match any node; but it doesn't. The equivalent expression, «//(node())» is short for «root(.)/descendant-or-self::node()/child::node()», and the only nodes that this can select are nodes that are children of something.

  * > «child::» (abbreviated to nothing: «») In general, if no PatternAxis is specified, the child axis is assumed

  * > the pattern «node()», which is short for «child::node()», will not match document nodes, attributes, or namespace nodes, because these nodes never appear as the child of another node.

  * > «node()» matches any node whatsoever (but remember that on its own, it means «child::node()»

  * > «node()», which is short for «child::node()», matches any node that is allowed to be the child of something (that is, an element node, text node, comment, or processing instruction).

などと何度もしつこく書いてあることのほうが重要に思えます :)


CC BY-SA 3.0
2017-11-20T05:49:54.660
39708
2017-11-20T05:49:54.660
26271
39595
answer