2010-12-12 90 views
7

我想在xslt的select語句中使用動態變量名稱。我們可以在xslt的select語句中使用動態變量名嗎?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:variable name="input" select="input/message" /> 
    <xsl:variable name="Name" select="'MyName'" /> 
    <xsl:variable name="Address" select="MyAddress" /> 
    <xsl:variable name="output" select="concat('$','$input')" /> <!-- This is not working --> 
    <output> 
     <xsl:value-of select="$output" /> 
    </output> 
</xsl:template> 

爲變量 「輸入」 可能的值是 '名稱' 或 '地址'。 輸出變量的select語句應該有一個基於輸入變量值的動態變量名稱。我不想使用xsl:choose。我想動態選擇值。 請給我一個解決方案。

謝謝, dhinu

+0

問得好,+1。查看我的答案,獲取完整而簡短的解決方案。 :) – 2010-12-12 04:43:57

回答

11

XSLT 1.0和XSLT 2.0不具有動態的評價。

解決您的問題

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output method="text"/> 

<my:values> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</my:values> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "document('')/*/my:values/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 

當下面的XML文檔應用:

<input> 
    <message>address</message> 
</input> 

產生想,正確的結果

MyAdress 

當同一變換這個XML文檔施加:

<input> 
    <message>name</message> 
</input> 

再次通緝,正確的結果產生

MyName 

終於:如果你不希望使用document()函數,但會使用xxx:node-set()擴展函數,那麼這個解決方案(看起來非常相似)就是你想要的,你可以在這裏查詢你的XSLT處理器文檔以獲得擴展名的確切名稱空間:

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

<xsl:variable name="vValues"> 
    <name>MyName</name> 
    <address>MyAdress</address> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:variable name="vSelector" 
    select="input/message"/> 
    <xsl:value-of select= 
    "ext:node-set($vValues)/*[name()=$vSelector]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

謝謝!它爲我工作..只是想知道是否有任何替代方式,而不使用額外的命名空間xmlns:my =「my:my」? – dhinu 2010-12-12 05:16:07

+0

@dhinu:很高興我的回答很有用。通過接受答案(通過點擊答案旁邊的複選標記)來表達SO的感激之情:)。你可以把''放在另一個文件中,並用'document()'函數再次訪問它。在XSLT 1.0中,你通常必須使用這種技術。如果元素位於''或''的主體中,則不能直接使用XPath訪問它們,並且需要首先應用擴展函數('xxx:node-set()') 。在XSLT 2.0中,可以直接訪問''或''中的元素。 – 2010-12-12 06:47:11

+0

您能否提供一個使用擴展函數(xxx:node-set())訪問xsl:變量主體中元素的示例? (即時通訊使用XSLT 1.0) – dhinu 2010-12-12 09:50:39

0

除了@ Dimitre的很好的答案,對於這種特殊情況下(輸出字符串值),你也可以使用:

<xsl:variable name="output" 
       select="concat(substring($Name, 1 div ($input = 'Name')), 
          substring($Address, 1 div ($input = 'Address')))"/> 
相關問題