2010-10-07 77 views
23

使用XSLT 1.0,我想基本上創建一個小的節點集,然後將其作爲參數傳遞給模板,類似如下:XSLT 1.0 - 創建節點集,並作爲參數傳遞

<xsl:call-template name="widget"> 
    <xsl:with-param name="flags"> 
    <items> 
     <item>widget.recent-posts.trim-length=100</item> 
     <item>widget.recent-posts.how-many=3</item> 
     <item>widget.recent-posts.show-excerpt</item> 
    </items> 
    </xsl:with-param> 
</xsl:call-template> 

的想法是,然後從widget模板中我可以寫這樣的:

<xsl:value-of select="$flags/item[1]" /> 

很顯然,我得到的編譯錯誤。我如何能實現這樣的事情?

+0

問得好(+1)。查看我的答案以獲得解釋和可能的解決方案。 – 2010-10-07 13:08:05

+0

是的,事實上,我只是將它作爲接受的答案。謝謝。 – 2013-02-22 09:49:14

+0

約翰,不客氣。 – 2013-02-22 15:23:55

回答

27

有一個在XSLT 1.0的方式(非標)動態地創建臨時樹和他們評估XPath表達式,但是這需要使用xxx:node-set()功能

每當節點被動態地一xsl:variablexsl:param的身體內部產生,那xsl:variable/xsl:param類型是RTF(結果樹片段)和W3 XSLT 1.0規格。可以嚴格限制可以針對RTF評估的XPath表達式。

作爲一種變通方法,幾乎​​每XSLT 1.0廠商都有自己xxx:node-set()擴展函數,它接受一個RTF,併產生從它正常的節點集。

對於不同的供應商,xxx前綴(或您選擇的任何其他前綴)所綁定的名稱空間不同。對於MSXML和兩個.NET XSLT處理器,它是:"urn:schemas-microsoft-com:xslt"。 EXSLT庫使用命名空間:"http://exslt.org/common"。該名稱空間EXSLT在許多XSLT 1.0處理器上實現,如果可能,建議使用其xxx:node-set()擴展名。

下面是一個簡單的例子

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:ext="http://exslt.org/common" 
    exclude-result-prefixes="ext msxsl" 
> 
<xsl:template match="/"> 
    <xsl:variable name="vTempRTF"> 
    <a> 
    <b/> 
    </a> 
    </xsl:variable> 

    <xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

正是我需要的,謝謝! +1 – 2010-10-08 08:26:06

6

好吧,我設法解決這個問題的方式如下:

首先添加自定義空間,以你的樣式,例如xmlns:myns="http://my.ns.com"

然後定義節點集在樣式表的頂部:

<myns:recent-posts-flags> 
    <item>widget.recent-posts.trim-length=100</item> 
    <item>widget.recent-posts.how-many=3</item> 
    <item>widget.recent-posts.show-excerpt</item> 
</myns:recent-posts-flags> 

然後在下面的方式參考:

<xsl:call-template name="widget"> 
    <xsl:with-param name="flags" select="document('')/*/myns:recent-posts-flags" /> 
</xsl:call-template> 

這工作,但它仍然是非常適合我的定義在<xsl:with-param>標籤本身中的節點集,就像我給的第一個例子..任何人都認爲這將是可能的?

+0

+1這是FAQ和[規格](http://www.w3.org/TR/xslt#stylesheet-element):'另外,xsl:stylesheet元素可能包含任何不是來自XSLT的元素只要元素的展開名稱具有非空名稱空間URI。 (...)這樣的元素可以提供例如擴展元素或擴展函數所使用的信息,關於如何處理結果樹的信息,關於如何獲得源樹的信息,關於樣式表的元數據,樣式表的結構化文檔。' – 2010-10-07 13:14:26

+0

您還需要定義「myns」,否則轉換將失敗。我發現這個:http://stackoverflow.com/questions/5873954/namespaces-in-xslt,幫助醫生製作了添加xmlns:myns =「http:// localhost」到我的xsl:stylesheet-node修復了這個問題。 – Lilleman 2012-10-23 11:28:05

+0

這就是我在答案的第二行中所說的。 – 2012-10-23 12:25:58