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)。
谢谢。
我不明白怎么“用”的作品,是不是 应该是返回 当比赛被匹配的值?
不,use
没有指定什么是 “返回”。从the spec:
使用属性是 指定的 密钥的值的表达式;对于匹配 模式的每个节点,表达式的评估值为 。
在键值use
的映射指定的键 - 键的值,在规范的语言 - 和match
指定这些键将映射到的值。换句话说,match
指定什么组和use
指定如何将它们分组。
假设您想通过sentence
的@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()]"/>
...因为它是由他们的父母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'
。
你是对的,先生!我误解了密钥的工作原理。干杯! – Spectraljump 2011-05-15 22:34:25
不客气! – 2011-05-15 22:37:00
有点难以帮助你,因为你实际上没有说出你想解决什么问题。但你似乎对钥匙有一些概念上的困惑。以这种方式思考它们:如果你想找到属性P的值为V的E元素,那么你需要定义密钥为<xsl:key name="N" match="E" use="P"/>
,其中P是一个XPath表达式,它使用E元素作为其上下文,决定有关财产的价值;然后您需要将其称为。 use表达式可以是任何您喜欢的XPath表达式,并且将使用匹配的E元素作为其上下文项来评估它。
你给出的例子似乎是合法的,但不是很有用;目前还不清楚你希望他们会做什么。
是不是应该将参考值_to_分配给匹配的节点? – 2011-05-15 21:39:14
@empo:是的,我看了一些Google搜索后的例子。但是这个事实不应该改变任何事情,因为我需要为匹配的值分配一个值有关的值 – Spectraljump 2011-05-15 21:52:38
因此,您想匹配'sentence/@ id'并且为每个'句子'返回'句子'的id,我对么? – 2011-05-15 21:58:04