使用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
相关产品推荐
相关产品推荐

