2012-02-12 133 views
6

我在學習xslt,並有一個關於如何在diff中使用xslt變量的問題。爲每個循環。我知道xslt不是過程語言,因此在for循環中聲明的變量不能在另一個循環中訪問。但是有沒有什麼辦法可以聲明全局變量,然後在第一個for循環中分配一些值並在第二個循環中使用該變量?xslt變量作用域及其用法

任何想法將不勝感激。

感謝

回答

13

有什麼辦法我只能申報格洛巴l變量,然後在第一個for循環中分配一些 值,並在第二個循環中使用該變量?

分配值給xsl:variable的方式(當然這僅僅是初始化)從xsl:for-each內,就是包括在變量的主體中的xsl:for-each

下面是一個完整的例子:

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

<xsl:template match="/*"> 
    <xsl:variable name="vMax"> 
     <xsl:for-each select="num"> 
     <xsl:sort data-type="number" order="descending"/> 

     <xsl:if test="position() = 1"> 
     <xsl:value-of select="."/> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:variable> 

    Values close to the maximum: 
<xsl:text/> 

     <xsl:for-each select="num"> 
     <xsl:if test="not($vMax - . > 3) "> 
     <xsl:value-of select="."/> 
     <xsl:text>&#xA;</xsl:text> 
     </xsl:if> 
     </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

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

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

...它首先定義了一個vMax變量變它的價值來自其所含的xsl:for-each

然後在第二個xsl:for-each中使用vMax變量輸出與計算出的最大值「接近」的所有數字。

的希望,正確的結果產生

 Values close to the maximum: 
07 
08 
09 
10 

也可以模擬「分配」通過使用一個遞歸調用命名模板不同值的變量,並通過了「新價值」作爲被調用模板的參數

下面是顯示此技術的示例。這裏我們計算包含在節點集的節點中的值的最大值。每次訪問節點集中的下一個節點時,都會將當前最大值與此值進行比較,如有必要,新的最大值將成爲下一個節點的值。然後,我們遞歸調用同一個模板,傳遞作爲當前最大的價值新的最大:

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

<xsl:template match="/*"> 
    <xsl:call-template name="max"> 
    <xsl:with-param name="pList" select="*"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="max"> 
    <xsl:param name="pMax" select="-99999999"/> 
    <xsl:param name="pList"/> 

    <xsl:choose> 
    <xsl:when test="$pList[1]"> 
     <xsl:variable name="vnewMax" select= 
     "$pMax * ($pMax >= $pList[1]) 
     + 
     $pList[1] * not($pMax >= $pList[1]) 
     "/> 

     <xsl:call-template name="max"> 
     <xsl:with-param name="pMax" select="$vnewMax"/> 
     <xsl:with-param name="pList" select="$pList[position() > 1]"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$pMax"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉換應用於同一個XML文檔(上圖),在想,正確的結果產生

10 
+0

那麼我如何得到兩個不同領域的價值以後使用? – Julian 2013-11-19 15:44:37

+0

只需定義兩個變量並將其初始化爲相應的「字段」即可。關於「以後」 - 功能語言中沒有這樣的事情。評估可以以任何順序和/或並行進行 – 2013-11-19 17:02:29

0

xsl:for-each是不是在這個意義上forforeach循環過程中的語言都有一個循環,使任何問題談論的循環是很難理解,更難以回答。

如果你想在XSLT中使用全局變量,你可以這樣做,但是你會將一個值綁定到聲明它的變量(即全局變量),你不能像for-each那樣在後面賦值想要做。

你寫
0
  1. , 'XSL是一個程序郎' ...那麼,它不是。這是一個聲明語言 ..
  2. 變量與其聲明一起分配,變量不會改變!
  3. 通常我們按照遞歸調用使用call-template PARAMS傳遞給他們的模板..(這就像遞歸函數與過程式語言傳遞參數調用)
    這是處理計數了一個方法和條件循環等。

我們將竭誠爲您服務櫃面如果您提及與示例XML的確切情況,以及你期待出來的:)輸出

+0

知道這是3年前,但他寫道:*我知道XSLT是不是程序語言* ... – LuckyLikey 2015-05-06 13:57:32

+1

@LuckyLikey,檢查問題的編輯歷史,迪米特里已經糾正它。早些時候它是「我知道XSLT是一種程序語言」 – 2015-05-12 09:26:13

+0

你是對的..我很抱歉得到一個+1 – LuckyLikey 2015-05-12 09:35:11