44977


`<xsl:template match="//p" >` と `<xsl:template match="p" >` の違いが良くわかりません。  
わかりやすくご解説可能な方がいらっしゃいましたら宜しくお願いいたします。

例えば以下のような stylesheet の場合、`<xsl:template match="//p" >` が優先して処理されます。

[code]

    <!-- xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <p p="1">
            <p p="2">
                <p p="3"/>
            </p>
        </p>
    </root>
    
    <!-- stylesheet -->
    <?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="2.0">
    
        <xsl:template match="//p" >
            <xsl:copy-of select="."></xsl:copy-of>
            <xsl:value-of select="'//p'"/>
        </xsl:template>
    
        <xsl:template match="p" >
            <xsl:copy-of select="."></xsl:copy-of>
            <xsl:value-of select="'p'"/>
        </xsl:template>
    
    </xsl:stylesheet>
    
[/code]


CC BY-SA 4.0
2018-06-19T00:57:31.637
44869
2018-06-22T07:13:31.530
25399
question
xsl xslt
xsl:template match="//[要素]" と match="[要素]" の違い


ご質問の結果はテンプレートの`@match`に記述するパターンから導かれる既定のテンプレートのプライオリティが異なるためにこのようなものとなります．

XSLT 2.0勧告の [6.4 Conflict Resolution for Template
Rules](https://www.w3.org/TR/xslt20/#conflict) によれば、

  * `match="p"`は`match="element(p)"`と等価で、`priority="0"`となります．
  * `match="//p"`は`match="document-node()/descendant-or-self::node()/p"`と等価で、`priority="0.5"`となります．

このため`match="//p"`の方が優先度が高くなり、p要素にマッチした際にこちらのテンプレートが採用されます．

これは次のように意図的に`@priority`を変えてテストしてみることで確認できます．

[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="2.0">
        <xsl:template match="//p" priority="0">
            <xsl:copy-of select="."/>
            <xsl:value-of select="'//p'"/>
        </xsl:template>
    
        <xsl:template match="p">
            <xsl:copy-of select="."/>
            <xsl:value-of select="'p'"/>
        </xsl:template>
    </xsl:stylesheet>
    
[/code]

とすれば例えばSaxonの場合次のような警告が出ます．

Severity: warning  
Description: Ambiguous rule match for
/root/p[1](https://www.w3.org/TR/xslt20/#conflict) Matches both
"element(Q{}p)" on line 11 of
file:/C:/Users/toshi/OneDrive/Documents/test/xslt/20180622-pattern/test2.xsl
and "document-node()//element(Q{}p)" on line 6 of
file:/C:/Users/toshi/OneDrive/Documents/test/xslt/20180622-pattern/test2.xsl

[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="2.0">
        <xsl:template match="//p">
            <xsl:copy-of select="."/>
            <xsl:value-of select="'//p'"/>
        </xsl:template>
    
        <xsl:template match="p" priority="0.5">
            <xsl:copy-of select="."/>
            <xsl:value-of select="'p'"/>
        </xsl:template>
    </xsl:stylesheet>
    
[/code]

とすれば、

Severity: warning  
Description: Ambiguous rule match for
/root/p[1](https://www.w3.org/TR/xslt20/#conflict) Matches both
"element(Q{}p)" on line 11 of
file:/C:/Users/toshi/OneDrive/Documents/test/xslt/20180622-pattern/test3.xsl
and "document-node()//element(Q{}p)" on line 6 of
file:/C:/Users/toshi/OneDrive/Documents/test/xslt/20180622-pattern/test3.xsl

の警告となります．

上記により、パターンの記述により、テンプレートには勧告で定められた既定の`@priority`が適用されることがわかるでしょう．


CC BY-SA 4.0
2018-06-22T01:32:14.487
44977
2018-06-22T07:13:31.530
2018-06-22T07:13:31.530
9503
9503
44869
answer