2011-05-15 85 views
3

我似乎無法弄清楚這件事情。是否有可能擁有以下關鍵?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

回答

3

我不明白怎麼「用」的作品,是不是 應該是返回 當比賽被匹配的值?

不,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屬性錯誤,因爲屬性沒有父母。

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'

+0

你是對的,先生!我誤解了密鑰的工作原理。乾杯! – Spectraljump 2011-05-15 22:34:25

+0

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

1

有點難以幫助你,因爲你實際上沒有說出你想解決什麼問題。但你似乎對鑰匙有一些概念上的困惑。以這種方式思考它們:如果你想找到屬性P的值爲V的E元素,那麼你需要定義密鑰爲<xsl:key name="N" match="E" use="P"/>,其中P是一個XPath表達式,它使用E元素作爲其上下文,決定有關財產的價值;然後您需要將其稱爲​​。 use表達式可以是任何您喜歡的XPath表達式,並且將使用匹配的E元素作爲其上下文項來評估它。

你給出的例子似乎是合法的,但不是很有用;目前還不清楚你希望他們會做什麼。