वहाँ किसी भी तरह से मैं सिर्फ वैश्विक संगठन घोषित कर सकते हैं है एल वैरिएबल फिर लूप के लिए पहले मान असाइन करें और लूप के लिए दूसरे में उस चर का उपयोग करें?
तरह से एक 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
से इसका मूल्य है।
फिर vMax
वैरिएबल का उपयोग दूसरे xsl:for-each
में किया जाता है ताकि सभी गणनाओं को आउटपुट किया जा सके जो इतनी गणना की गई अधिकतम "बंद" हैं।
चाहता था, सही परिणाम उत्पादन किया जाता है:
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
तो मुझे बाद में उपयोग करने के लिए दो अलग-अलग फ़ील्ड का मूल्य कैसे प्राप्त होगा? – Julian
बस दो चर परिभाषित करें और प्रत्येक को "फ़ील्ड" में प्रारंभ करें। "बाद में" के बारे में - एक कार्यात्मक भाषा में ऐसी कोई बात नहीं है। मूल्यांकन किसी भी क्रम में और/या समानांतर में हो सकता है –