2012-07-11 23 views
1

我輸入XML文件是follws:在muenchian分組中,爲什麼我可以直接使用密鑰時使用generate-id?

<root> 
    <Property> 
    <Name>Jack</Name> 
    <Color>red.green</Color>  
    </Property> 
    <Property> 
    <Name>Jill</Name> 
    <Color>red.blue</Color>  
    </Property> 
    <Property> 
    <Name>Jim</Name> 
    <Color>red.orange</Color>  
    </Property> 
    <Property> 
    <Name>Tom</Name> 
    <Color>black.brown</Color>  
    </Property> 
    . 
    . 
    . 
    <Property> 
    <Name>Tom</Name> 
    <Color>white</Color>  
    </Property> 
</root> 

在XSLT 1.0我想選擇所有的屬性元素,其元素值之前。是相同的並且在之前做出相同的值。作爲一個記錄。

實例(使用樣本子輸入文件) 1)input.xml中

<root> 
     <Property> 
     <Name>Jack</Name> 
     <Color>red.green</Color>  
     </Property> 
     <Property> 
     <Name>Jill</Name> 
     <Color>red.blue</Color>  
     </Property> 
     <Property> 
     <Name>Jim</Name> 
     <Color>red.orange</Color>  
     </Property>    
    </root> 

樣本子的Output.xml

<red> 
    <green>Jack<green> 
    <blue>Jill<blue> 
    <orange>Jim<orange>  
<red> 

2)input.xml中

<root> 
     <Property> 
     <Name>Jack</Name> 
     <Color>red.green</Color>  
     </Property> 
     <Property> 
     <Name>Jill</Name> 
     <Color>green.orange</Color>  
     </Property> 
     <Property> 
     <Name>Jim</Name> 
     <Color>orange.red</Color>  
     </Property> 
     <Property> 
     <Name>Ted</Name> 
     <Color>brown</Color>  
     </Property>  
    </root> 

樣品sub output.xml

<red> 
    <green>Jack</green> 
</red> 
<green> 
    <orange>Jill<orange> 
</green> 
<orange> 
    <red>Jim</red> 
</orange> 
<brown>Ted</brown> 

我也問過類似的問題在計算器本身,但我得到了與報表弄得似

<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/> 

,其中關鍵是:

<xsl:key name='test' match='Property' use='.'/> 

[還有一個問題在這裏:爲關鍵匹配值應該作爲Property或root/Property給出。我在想這個鍵根據上下文選擇Property元素。 (這裏的上下文是/根/屬性,因爲它是在聲明中<xsl:apply-templates select="/root/Property)這裏給出的XPath表達式,真正的請清楚這一點]

我的實際問題是

,而不是使用這樣的:

<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/> 

我可以用這個:

<xsl:apply-templates select="key('test',//root/Property)"/> 

,其中關鍵是

<xsl:key name='test' match='Property' use='.'/> 

什麼是實際差異(在執行和流量方面)?

+1

這個問題中的最後一行代碼在語法上是無效的,因此,只需調用'key()'函數就可以執行分組的語句是錯誤的(沒有根據)。請編輯問題並提供一個完整的工作示例,其他人可以複製和粘貼,然後運行和複製(提示:由於您的陳述錯誤,您將無法提供此類示例)。至於所有其他問題,對於單個SO問題來說太多了,而且答案需要是完整的講座。請分成不同的問題。最好的建議:讀一本好書。 – 2012-07-12 04:38:31

+0

@DimitreNovatchev,我編輯了這個問題。 – user1497365 2012-07-12 19:44:13

+0

@DimitreNovatchev任何好的書或網站,你可以建議將是有益的。我是XSLT的新手,在過去的幾天裏我正在使用XSLT。因此,理解選擇中的key()是如何工作的,以及在select XPATH表達式中key()如何在generate-id函數中工作會很好嗎? – user1497365 2012-07-12 20:01:55

回答

2

指令

<xsl:apply-templates select="key('test',//root/Property)"/> 

得到所有的屬性的元素,提取它們的值,則對於每一個值,找到具有該值的所有屬性的元素;那麼它消除了重複;所以最終的結果是你可以通過非常冗長的路線找到所有的Property元素。

指令

<xsl:apply-templates 
select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/> 

是不正確的或者,除非你的屬性的元素有孩子叫物業,這似乎不太可能。我想你打算

<xsl:apply-templates 
select="/root/Property[generate-id(.) = generate-id(key('test',.)[1])]"/> 

這樣做是要選擇一個屬性元素如果標識符(生成-ID)是一樣的具有價值的第一屬性元素的標識符。換句話說:對於輸入中的每個屬性值,都有一組具有該值的Property元素,這樣做是爲了選擇每個組中的第一個元素。

如果您仍然無法擺脫困境,請嘗試轉移到XSLT 2.0,使分組變得非常簡單。

+0

嗨@邁克爾,在這裏從輸入文件你是什麼意思說屬性值? 標籤或傑克和red.green組合或其他任何東西(在你看來)? Michael,現在我們(開發人員)正在使用XSLT 1.0,因此我無法訪問XSLT 2.0 – user1497365 2012-07-12 19:30:59

+0

您的答案很有用,我想說的是: user1497365 2012-07-12 19:37:18

+0

」如果它的標識符(generate-id)是與具有該值的第一個Property元素的標識符相同。「在這裏,你指的是「擁有那個價值」,你指的是什麼?你是否想說選擇只返回重複的Property元素?你能否以更詳細的方式解釋你的答案(在抓住流程方面存在一些差距,如何使用工作並執行)? – user1497365 2012-07-12 20:16:46

相關問題