2010-09-12 49 views
2

我想通過索引選擇一個元素並將索引編號傳入參數中,param通過PHP傳入。這裏就是我想:根據參數中定義的索引選擇xsl元素

//PHP 
$xslt->setParameter('','player',$player); 
$xslt->importStylesheet($XSL); 
print $xslt->transformToXML($data); 

//xslt 
<xsl:param name="player" data-type="number"/> 

<template match="/"> 
    <xsl:value-of select="result[$player]/@name" /> 
</template> 

而且我知道帕拉姆的值被傳遞正確的,因爲我可以輸出的參數($播放器)的值,它會輸出正確的值。如果我硬編碼的索引號「$球員」到任何數量的指標我要像如下:

<template match="/"> 
    <xsl:value-of select="result[2]/@name" /> 
</template> 

它的工作原理。所以,我在這裏做錯了什麼。你不能使用params /變量來選擇索引嗎?

+0

你是如何將參數傳遞給模板的?那是如何設定的? – Oded 2010-09-12 15:59:03

+0

在xlst被調用之前,它正在使用PHP進行定義和設置。 $ xslt-> setParameter('','player',$ player); \t \t \t \t $ xslt-> importStylesheet($ XSL); \t \t \t \t print $ xslt-> transformToXML($ data); – Jeff 2010-09-12 16:04:09

+1

這個模板真的是你在用的嗎?在具有「select = result」的根節點(即'/')上的模板匹配將在文檔元素上匹配,其中不能多於一個。你的選擇可能應該是'*/result',或者'/ */result',或者'//結果' – 2010-09-12 18:03:17

回答

2

它可能會將xsl:param的值作爲字符串評估,而不是數字。您可以嘗試使用number()函數將其明確轉換爲數字。

<xsl:value-of select="result[number($player)]/@name" /> 

指定數字的謂詞過濾器對於[position()=$param]是短手。您可以使用xsl:param謂詞過濾器裏面,這樣,它會評估xsl:param值爲數字:

<xsl:value-of select="result[position()=$player]/@name" /> 
1

如果我硬編碼的索引號 「$球員」到任何數量的指數我的 要象下面這樣:

<template match="/"> 
    <xsl:value-of select="result[2]/@name" /> 
</template> 

它的工作原理。

沒有,任何符合標準的XSLT處理器不會選擇任何

result[2]/@name 

是針對當前節點的相對錶達,並且當前節點是/ - 文檔節點。

任何良好的XML文檔具有正好一個頂部元件(無法在兩個),因此

result[2]

相當於:

/result[2]

,並且不選擇任何內容。

很可能您正在處理另一個表達式,您尚未顯示(或模板不匹配/)。

<xsl:param name="player" data-type="number"/> 

這是無效的語法。 <xsl:param>指令沒有data-type屬性。

事實上,在XSLT 1.0中沒有任何方法來指定變量類型或參數

這就是爲什麼在:

result[$player]/@name 

$player被視爲字符串 - 不爲整數。

達到你想要的「索引」,使用

result[position()=$player]/@name 

position()函數返回一個數字,這將導致=操作者的另一操作數轉換爲(和使用)數量。