2009-01-15 82 views
5

我將一串鍵值對作爲參數傳遞給XSL(日期 - >「1月20日」,作者 - >「Dominic Rodger」,...)。XSLT中的動態變量

這些在一些XML我解析引用 - 在XML看起來是這樣的:

<element datasource="date" /> 

目前,我無法工作,如何1月20日擺脫這些除了與一個可怕的<xsl:choose>聲明:

<xsl:template match="element"> 
    <xsl:choose> 
    <xsl:when test="@datasource = 'author'"> 
     <xsl:value-of select="$author" /> 
    </xsl:when> 
    <xsl:when test="@datasource = 'date'"> 
     <xsl:value-of select="$date" /> 
    </xsl:when> 
    ... 
    </xsl:choose> 
</xsl:template> 

我想使用類似:

<xsl:template match="element"> 
    <xsl:value-of select="${@datasource}" /> 
</xsl:template> 

但我懷疑這是不可能的。我打算使用外部函數調用,但希望避免在我的XSL中枚舉所有可能的映射鍵。有任何想法嗎?

感謝,

大教堂

+0

請別注意,從提出的三個答案,兩者是不正確的 - 沒有一個「+」操作符在XPath的字符串,而且,AVT不能爲「選擇」指定屬性在XSLT中。我的解決方案已經過測試和工作 – 2009-01-30 00:05:19

回答

2

這裏是一個可能的解決方案,不過我建議你把所有的參數在一個單獨的XML文件,並與document()功能訪問它們:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
exclude-result-prefixes="ext" 
> 
<xsl:output method="text"/> 

<xsl:param name="date" select="'01-15-2009'"/> 
<xsl:param name="author" select="'Dominic Rodger'"/> 
<xsl:param name="place" select="'Hawaii'"/> 
<xsl:param name="time" select="'midnight'"/> 

<xsl:variable name="vrtfParams"> 
    <date><xsl:value-of select="$date"/></date> 
    <author><xsl:value-of select="$author"/></author> 
    <place><xsl:value-of select="$place"/></place> 
    <time><xsl:value-of select="$time"/></time> 
</xsl:variable> 

<xsl:variable name="vParams" select="ext:node-set($vrtfParams)"/> 

    <xsl:template match="element"> 
     <xsl:value-of select= 
     "concat('&#xA;', @datasource, ' = ', 
       $vParams/*[name() = current()/@datasource] 
       )" 
     /> 
    </xsl:template> 
</xsl:stylesheet> 

當下面的XML應用這種轉變文檔

<data> 
    <element datasource="date" /> 
    <element datasource="place" /> 
</data> 

正確的結果產生

日期= 2009年1月15日

地方=夏威夷

待辦事項使用xxx:node-set()功能(the EXSLT one這裏使用)至RTF(Result Tree Fragment)轉換爲常規XML文檔(臨時樹)。

-2

如何

<xsl:template match="date-element"> 
    <xsl:text>${date}</xsl:text> 
</xsl:template> 

即而不是使用不同的元素名稱使用屬性,匹配。

如果您無法更改源XML,請通過將屬性轉換爲正確元素名稱的小型XSLT來運行它。

另一種解決方案是將xsl:param元素放入不同的XML文檔(或嘗試使XSLT模板再次自我閱讀)。然後你可以使用xsl:key和key()來引用它們。

[編輯]用xsl:text取代xsl:value-of。我沒有XSLT util,所以我無法測試它。如果這不起作用,請發表評論。

+0

對不起,但「select」屬性是唯一不能指定AVT(Attribute-value-templates)的屬性。 – 2009-01-30 00:02:39

0

如果您的@datasource始終與參數名稱匹配,則可以嘗試「評估」功能。注意:此代碼未經測試。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exslt-dynamic="http://exslt.org/dynamic" 
> 

<xsl:param name="date"/> 

<xsl:template match="element"> 
    <xsl:value-of select="exslt-dynamic:evaluate('$' + @datasource)"/> 
</xsl:template> 

</xsl:stylesheet> 
+1

確實沒有經過測試。在XPath中,不能求和('+')字符串 - 這將永遠不會編譯。 – 2009-01-30 00:00:12