2012-04-03 87 views
0

我有一個模板XSLT:請路徑模板/相對解析爲模板

<xsl:template name="template"> 
<xsl:param name="param"/> 
</xsl:template> 

我稱之爲使用

<xsl:call-template name="template"> 
<xsl:with-param name="param" select="."/> 
</xsl:call-template> 

這解決的內容。到一個字符串,並將它們傳遞給模板。

然而,它解決了。相對於模板調用。如果我更改模板中的上下文,如何才能使模板中的參數相對於新的上下文得到解決?


實施例添加作爲每個請求:

<xsl:template name="template"> 
    <xsl:param name="param1"/> 
    <xsl:param name="param2"/> 
    <xsl:for-each select="$param1"> 
     <xsl:value-of select="func:Lookup($param2)"/> 
    </xsl:for-each> 
</xsl:template> 

<xsl:call-template name="template"> 
    <xsl:with-param name="param1" select="element"/> 
    <xsl:with-param name="param2" select="."/> 
</xsl:call-template> 

其中參數1和參數是相對的XPath。

我想要做的是將兩個相對xpaths傳遞給模板,然後解決它們。 <xsl:for-each select="$param1">應解析爲某些元素,然後.應解析爲相對於每個元素。 $ param2應該相對於$ param1解析。

但實際發生的事情都是相對於模板調用解決的。對於param1,這是可以的,但對於param2不適用。

如果不是for-each,我可以通過element/.作爲param2。但是這不會因爲for-each而起作用。

+0

在我看來,無論你想做什麼都可以做得更簡單。也許你可以添加一個你試圖實現的例子。 – Maestro13 2012-04-03 17:59:16

+0

剛剛添加了一個例子。 – 2012-04-03 18:15:01

+0

我已經考慮過字符串('。'),但它根本不能解析,即使在模板內部也是如此。 – 2012-04-03 18:16:48

回答

0

參數值實際上是一個節點(當前節點)而不是一個字符串,但你是對的(如在大多數語言中),該參數保存一個值而不是語法片段。如果你確實需要傳遞一個字符串(或者更常見的是從源代碼中提取的xpath的片段),你需要一個動態的評估擴展,比如axon:評估,許多但不是全部的產品都有這樣的擴展。如果要求很簡單,如元素名稱),而不是任意的XPath可以傳遞一個字符串,如

<xsl:with-param name="paaram2" select="'foo'"/> 

然後用它作爲

<xsl:value-of select="func:Lookup(*[name()=$param2])"/> 

將元素<foo/>傳遞給函數。

在這裏,從內部讀表達出

* 

選擇當前節點的所有子元素

name() 

然後返回該元素所以

[name()=$param2] 
的名稱

僅適用於參數中指定名稱的子元素,所以

*[name()=$param2] 

選擇具有名稱的元素由所述參數指定和

func:Lookup(*[name()=$param2]) 

應用擴展功能的那些元件。

+0

感謝您的回答,但是我無法完成工作。你能解釋一下嗎?例如什麼是*用於?你爲什麼要把'name()= $ param2'而不是'name($ param2)'?我的理解是'name()'接受一個節點集並返回一個字符串,而不是相反。 ) 謝謝 – 2012-04-04 08:43:17

+0

對於輸入錯誤,感謝您的建議並逐行添加 – 2012-04-04 09:25:55

+0

感謝您的解釋。不幸的是,這行不通。我想我需要像撒克遜這樣的東西:按照你的建議評估。 – 2012-04-04 10:11:59