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

Why //descendant is evaluating siblings as well in this XSLT template?

我很好奇为什么这个 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>  

关于这个 XML 文档

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE a>
    <a>
      <b>
        <c>
          <ca>CA</ca>
          <cd>CD</cd>
        </c>   
      </b>  
    </a>

有结果: CACD

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

的任何级别的 44=]

cdca的兄弟姐妹,所以我很困惑。

如果能提供任何帮助,我将不胜感激。

提前致谢。

使用.//cd到select相对于上下文节点,以/开头的路径总是selects从文档node/root节点开始,即 //cd/descendant-or-self::node()/cd.