2012-11-03 16 views
1

是否可以使用XSL訪問名稱存儲在另一個變量(或參數)中的變量(或參數)?如果不是,爲什麼?間接變量/參數引用(名稱在另一個屬性/另一個變量中)

我是xsl的新手,來自其他語言,可以訪問此功能,如bash,ant。也許我錯了,即使在尋找這個問題的答案。但因爲我沒有找到它,我認爲應該有一個。

兩個例子。我有參數p1,p2,p3。然後我有一個參數pname,它的值是一個字符串p2。我想使用pname來讀取p2的值,如$$pname${$pname}。或者以更復雜的方式。如果pnumber等於2,那麼我想要讀取名稱爲concat('p', $pnumber)的參數值,我將其編碼爲
param-value(concat('p', $pnumber))

+0

您引用的語言 - bash,ant - 是基於宏的語言,幾乎所有的事情都是在運行時發生的。 XSLT不是那樣的;它更像是基於編譯器的語言(C/Java等),其中變量和函數名稱純粹是編譯時構造。 –

+0

@Michael,你不覺得這可能是這個問題的答案嗎?誰能比你更好地回答「爲什麼」? :) – Jarekczek

回答

0

這是可能的whenthe XSLT樣式表訪問本身作爲一個普通的XML文檔

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="p1" select="'P1-Value'"/> 
<xsl:param name="p2" select="'P2-Value'"/> 
<xsl:param name="p3" select="'P3-Value'"/> 

<xsl:param name="pName" select="'p3'"/> 
<xsl:param name="pNumber" select="2"/> 

<xsl:variable name="vDoc" select="document('')"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "concat('Param with name ', 
      $pName, 
      ' has value: ', 
      $vDoc/*/xsl:param[@name = $pName]/@select 
      )"/> 
    <xsl:text>&#xA;</xsl:text> 

    <xsl:variable name="vParam" select= 
     "$vDoc/*/xsl:param[@name = concat('p', $pNumber)]"/> 

    <xsl:value-of select= 
    "concat('Param with name p', 
      $pNumber, 
      ' has value: ', 
      $vParam/@select 
      )"/> 

</xsl:template> 
</xsl:stylesheet> 

產生想要的結果

Param with name p3 has value: 'P3-Value' 
Param with name p2 has value: 'P2-Value' 

說明

的表達document('')選擇當前XSLT樣式表的文檔節點。

一個限制是當前的XSLT樣式表必須具有(可通過)URI訪問(例如駐留在給定文件中並且可以通過其文件名訪問) - 如果樣式表的上述代碼不會生成正確的結果是動態生成的(內存中的一個字符串)。

+0

這是一個解決方案的參數,但限於參數的值不是從外部設置(命令行,'addParameter'),對不對? – Jarekczek

+0

@Jarekczek:正確。這種方式不能訪問參數的動態值。在XSLT中不存在反射 - 儘管使用上述技術可以在運行時發現參數和變量名稱,但不可能找到它們的動態分配值 - 其中一個原因是在函數式語言沒有時間概念 - 當我們的代碼執行時,不能保證某些特定的代碼片段(已賦值給參數)已經被執行。 –

0

便攜式解決方法。如果您同時控制應用程序和樣式表,則應該將作爲xml文檔傳遞參數。大多數處理器都提供了將參數設置爲節點集的選項。例如,在MSXML我做到了使用:

xslProc.addParameter("params", xmlParams) 

其中xslProc是處理器的類型,使用方法createProcessorxmlParams"Msxml2.XSLTemplate.6.0"創建的是DomDocument。在樣式表中我用類似的東西accesing我的參數:

<xsl:variable name="value"> 
    <xsl:value-of select="$params//*[name() = concat('p', $pnumber)]" /> 
</xsl:variable> 

如果處理器不支持節點設置外部參數,可以始終以一個XML文檔中的數據相結合的參數。這在內存中運行良好。如果可以訪問外部文件,則可以使用document('params.xml')語法來訪問存儲在單獨文件中的參數。

我也在尋找一種解析xml字符串的可能性,並有一個節點集合,但它似乎只能作爲一些xslt 2.0解析器中的擴展使用。我想要1.0解決方案。

0

libxslt東西有可能通過dyn:evaluate擴展。這裏是the description。有總提及3-處理器,其被說成支持該功能的:從Apache的

  • 的Xalan-J(2.4.1版本)和
  • 4XSLT,從4Suite進行。 (版本0.12.0a3)
  • Daniel Veillard等人的libxslt (版本1.0.19)
相關問題