为什么 //descendant 也在这个 XSLT 模板中评估兄弟姐妹?

Mar*_*ary 3 xml xslt xpath descendant xslt-1.0

我很好奇为什么这个 XSLT :

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="/">
          <xsl:apply-templates select="//ca"/> 
      </xsl:template>
      
      
      <xsl:template match="ca">  
          <xsl:value-of select="."/>
          <xsl:value-of select="//cd"/> 
      </xsl:template>
    </xsl:stylesheet>  
Run Code Online (Sandbox Code Playgroud)

在此 XML 文档上

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE a>
    <a>
      <b>
        <c>
          <ca>CA</ca>
          <cd>CD</cd>
        </c>   
      </b>  
    </a>
Run Code Online (Sandbox Code Playgroud)

结果为:CACD

我最感兴趣的是为什么 CD 能够正确评估,因为我认为模板中的当前上下文是由匹配属性定义的,也就是说,第二个模板中的ca 。如果这是正确的,在ca的上下文中,使用 //cd ,据我所知,XSLT 处理器应该通过名称为cd的任何级别的ca的任何后代进行搜索。

cd是ca的兄弟,所以我很困惑。

我将不胜感激任何有助于阐明这一点的帮助。

先感谢您。

Mar*_*nen 5

用于.//cd相对于上下文节点进行选择,以 开头的路径/始终选择从文档节点/根节点开始,//cd/descendant-or-self::node()/cd