在XSLT中选择属性与节点值匹配的节点

在XSLT中选择属性与节点值匹配的节点,xslt,Xslt,下面返回11个节点: //xs:schema/xs:element/xs:keyref 下面返回的Artist\u FK\u AlbumArtistId: ars:Relation/@Name 这将返回一个节点: //xs:schema/xs:element/xs:keyref[@name='Artist_FK_AlbumArtistId'] 但是,以下内容不会返回任何内容: //xs:schema/xs:element/xs:keyref[@name=ars:Relation/@N

下面返回11个节点:

//xs:schema/xs:element/xs:keyref

下面返回的
Artist\u FK\u AlbumArtistId

ars:Relation/@Name

这将返回一个节点:

//xs:schema/xs:element/xs:keyref[@name='Artist_FK_AlbumArtistId']

但是,以下内容不会返回任何内容:

//xs:schema/xs:element/xs:keyref[@name=ars:Relation/@Name]

我如何使用
ars:Relation/@Name
的值来筛选出我想要的
xs:keyref

我总是在问了十分钟后设法找到答案

以下是如何做到这一点:

<xsl:variable name="relationName" select="ars:Relation/@Name" />
<xsl:value-of select="//xs:schema/xs:element/xs:keyref[@name=$relationName]"/>

我会定义一个键

<xsl:key name="ref-by-name" match="xs:element/xs:keyref" use="@name"/>

然后您可以单独使用
键('ref-by-name',ars:Relation/@name)

ars:Relation/@Name
是相对于执行XPath的上下文中的当前节点的路径。但是谓词中的同一表达式是相对于谓词正在测试的节点的,即

//xs:schema/xs:element/xs:keyref[@name=ars:Relation/@Name]
正在
xs:keyref
中查找
ars:Relation
元素。但由于您已将问题标记为“xslt”,因此可以访问
current()
函数,该函数提供从谓词内部到整个表达式外部的当前上下文节点的访问:

//xs:schema/xs:element/xs:keyref[@name = current()/ars:Relation/@Name]

要使其更短,是的,但如何添加
[@name=$relationName]
?按键访问更有效。我不理解您关于
[@name=$relationName]
的问题,因为您的原始代码没有使用任何变量引用
$relationName
,并且使用键当然不需要使用。使用我的答案中定义的键,访问
xs:keyref
元素所需的函数调用
key('ref-by-name',ars:Relation/@name)
,其中
name
属性等于
ars:Relation/@name
。我会检查它,然后确定,在我最初的问题中没有提到relationName…我是不是已经在
ars:relational/@Name
current()
,还是在进行匹配时它会改变范围?@Asken在
[]
之外,
current()
表示与当前模板的上下文节点相同。括号内的
current()
保持不变,但
更改为引用谓词正在测试的节点。