You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用xsl:apply-templates条件过滤时的变量使用疑问

为什么直接在XPath中使用@Id会失败,必须先存到变量里?

正常运行的代码:

<xsl:template match="msa:Group">
    <h2>
        <xsl:value-of select="."/>
    </h2>

    <xsl:variable name="iGroupId" select="@Id"/>

    <xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[msa:GroupId=$iGroupId]">
            <xsl:sort select="msa:Name" data-type="text" order="ascending"/>
    </xsl:apply-templates>
</xsl:template>

直接使用@Id会失败的写法:

select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[msa:GroupId=@Id]"

原因解释:

问题核心是XPath的上下文节点规则:

  • 当你在msa:Publisher[msa:GroupId=@Id]的谓词(方括号内的条件)中写@Id时,它的上下文是当前正在遍历的msa:Publisher节点——也就是说,它会尝试读取这个msa:Publisher自身的@Id属性,而非模板当前匹配的msa:Group节点的@Id。
  • 把@Id存入变量$iGroupId后,变量的取值基于模板匹配的msa:Group节点上下文,所以在谓词里引用$iGroupId时,用的是msa:Group的@Id值,自然能正确匹配到对应分组的发布者。

另外补充一种不用变量的等效写法:可以用current()函数直接引用当前模板的上下文节点,无需借助变量:

select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[msa:GroupId=current()/@Id]"

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:05:02