XSLT关键元素:“使用”父节点的“匹配”

时间:2011-05-15 21:24:26

标签: xslt xslt-1.0

我似乎无法弄明白这件事。是否可以使用以下密钥?

<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence/@ID"
         use="--and here return the 'sentences' node--"/>

我不知道“使用”是如何工作的,是不是它应该是匹配匹配时返回的值?

我看到use="."在我的情况下返回属性的值。 (为什么?是否与匹配相关?不应.表示node()?而不是node()/@

但最重要的是,为什么我不能这样做:use="parent::sentence[@ID=name()]"

那我怎么办呢?我需要在@ID上匹配,但要返回它的父级(更具体地说,是父级的ID)。

谢谢。

3 个答案:

答案 0 :(得分:3)

  

我不知道“使用”是如何工作的,不是吗   应该是你返回的价值   比赛何时匹配?

不,use未指定任何内容为“已退回”。来自the spec

  

use属性是   指定值的表达式   钥匙;表达式被评估   每个节点匹配一次   图案。

在键值use的映射中,指定键 - 键的值,以规范的语言 - 和match指定这些键将映射到的值。换句话说,match指定要分组的use指定如何对其进行分组。

假设您希望按其父sentence的{​​{1}}对@ID元素进行分组。你可以这样做:

sentence

你的表达毫无意义:

<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence" 
         use="parent::*/@ID"/>

...因为它试图通过其中一个父<xsl:key name="kMatchSentenceID_withTokId" match="sentences/sentence/@ID" use="parent::sentence[@ID=name()]"/> 元素对ID属性进行分组,这已经是一个错误,因为属性没有父母。

答案 1 :(得分:1)

假设这样的事情

<sentences id="parent">
  <sentence id="childa"/>
  <sentence id="childb"/>
</sentences>

你需要:

<xsl:key name="sentence" match="sentences" use="sentence/@id"/>

然后,例如XPath key('sentence','childa')/@id将返回 'parent'

答案 2 :(得分:1)

帮助你有点困难,因为你实际上没有说出你要解决的问题。但是你似乎对键有一些概念上的困惑。以这种方式考虑它们:如果要查找属性值为V的E元素,则需要将键定义为<xsl:key name="N" match="E" use="P"/>,其中P是XPath表达式,使用E元素作为其背景,决定了有关财产的价值;然后你需要将其称为key('N', V)。 use表达式可以是您喜欢的任何XPath表达式,它将使用匹配的E元素作为其上下文项进行评估。

你给出的例子似乎是合法的但不是很有用;目前还不清楚你希望他们做什么。