为什么 //descendant 也在这个 XSLT 模板中评估兄弟姐妹?
我很好奇为什么这个 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。
cd 是 ca 的兄弟,所以我很困惑。
我将不胜感激任何有助于阐明这一点的帮助。
先感谢您。
I am curious why this 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>
over this XML document
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE a>
<a>
<b>
<c>
<ca>CA</ca>
<cd>CD</cd>
</c>
</b>
</a>
has the result:
CACD
I'm mostly interested in why CD evaluates properly because I thought current context in a template is defined by match attribute, that is to say, ca in the second template.
If that was correct, in the context of ca, with //cd, as far as I know, the XSLT processor should be searching by any descendant of ca of any level with name cd.
cd is a sibling of ca, so I am very confused.
I would appreciate any help which sheds light on this.
Thank you in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用
.//cd
进行相对于上下文节点的选择,以/
开头的路径总是选择从文档节点/根节点开始,即//cd
是/descendant-or-self::node()/cd
。Use
.//cd
to select relative to the context node, a path starting with/
always selects starting at the document node/root node, i.e.//cd
is/descendant-or-self::node()/cd
.