我在學習xslt,並有一個關於如何在diff中使用xslt變量的問題。爲每個循環。我知道xslt不是過程語言,因此在for循環中聲明的變量不能在另一個循環中訪問。但是有沒有什麼辦法可以聲明全局變量,然後在第一個for循環中分配一些值並在第二個循環中使用該變量?xslt變量作用域及其用法
任何想法將不勝感激。
感謝
我在學習xslt,並有一個關於如何在diff中使用xslt變量的問題。爲每個循環。我知道xslt不是過程語言,因此在for循環中聲明的變量不能在另一個循環中訪問。但是有沒有什麼辦法可以聲明全局變量,然後在第一個for循環中分配一些值並在第二個循環中使用該變量?xslt變量作用域及其用法
任何想法將不勝感激。
感謝
有什麼辦法我只能申報格洛巴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>
</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
xsl:for-each
是不是在這個意義上for
或foreach
循環過程中的語言都有一個循環,使任何問題談論的循環是很難理解,更難以回答。
如果你想在XSLT中使用全局變量,你可以這樣做,但是你會將一個值綁定到聲明它的變量(即全局變量),你不能像for-each
那樣在後面賦值想要做。
call-template
PARAMS傳遞給他們的模板..(這就像遞歸函數與過程式語言傳遞參數調用) 我們將竭誠爲您服務櫃面如果您提及與示例XML的確切情況,以及你期待出來的:)輸出
知道這是3年前,但他寫道:*我知道XSLT是不是程序語言* ... – LuckyLikey 2015-05-06 13:57:32
@LuckyLikey,檢查問題的編輯歷史,迪米特里已經糾正它。早些時候它是「我知道XSLT是一種程序語言」 – 2015-05-12 09:26:13
你是對的..我很抱歉得到一個+1 – LuckyLikey 2015-05-12 09:35:11
那麼我如何得到兩個不同領域的價值以後使用? – Julian 2013-11-19 15:44:37
只需定義兩個變量並將其初始化爲相應的「字段」即可。關於「以後」 - 功能語言中沒有這樣的事情。評估可以以任何順序和/或並行進行 – 2013-11-19 17:02:29