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

问题描述:

我似乎无法弄清楚这件事情。是否有可能拥有以下关键?XSLT关键元素:“使用”“匹配”的父节点

<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)。

谢谢。

+0

是不是应该将参考值_to_分配给匹配的节点? – 2011-05-15 21:39:14

+0

@empo:是的,我看了一些Google搜索后的例子。但是这个事实不应该改变任何事情,因为我需要为匹配的值分配一个值有关的值 – Spectraljump 2011-05-15 21:52:38

+0

因此,您想匹配'sentence/@ id'并且为每个'句子'返回'句子'的id,我对么? – 2011-05-15 21:58:04

我不明白怎么“用”的作品,是不是 应该是返回 当比赛被匹配的值?

不,use没有指定什么是 “返回”。从the spec

使用属性是 指定的 密钥的值的表达式;对于匹配 模式的每个节点,表达式的评估值为 。

在键值use的映射指定的键 - 键的值,在规范的语言 - 和match指定这些键将映射到的值。换句话说,match指定什么组和use指定如何将它们分组。

假设您想通过sentence@IDsentence元素进行分组。你可以是这样做的:

<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()]"/> 

...因为它是由他们的父母sentence元素之一,它已经是一个试图组ID属性错误,因为属性没有父母。

假设是这样的

<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'

+0

你是对的,先生!我误解了密钥的工作原理。干杯! – Spectraljump 2011-05-15 22:34:25

+0

不客气! – 2011-05-15 22:37:00

有点难以帮助你,因为你实际上没有说出你想解决什么问题。但你似乎对钥匙有一些概念上的困惑。以这种方式思考它们:如果你想找到属性P的值为V的E元素,那么你需要定义密钥为<xsl:key name="N" match="E" use="P"/>,其中P是一个XPath表达式,它使用E元素作为其上下文,决定有关财产的价值;然后您需要将其称为​​。 use表达式可以是任何您喜欢的XPath表达式,并且将使用匹配的E元素作为其上下文项来评估它。

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