2012-02-12 13 views
6

मैं xslt सीख रहा हूं और इस बारे में एक सवाल था कि मैं difs में xslt चर का उपयोग कैसे कर सकता हूं। प्रत्येक पाश के लिए। मुझे पता है कि xslt एक प्रक्रियात्मक भाषा नहीं है इसलिए लूप के लिए घोषित वैरिएबल को किसी अन्य लूप में एक्सेस नहीं किया जा सकता है। लेकिन क्या कोई तरीका है कि मैं सिर्फ ग्लोबल वैरिएबल घोषित कर सकता हूं, फिर लूप के लिए पहले कुछ वैल्यू असाइन कर सकता हूं और लूप के लिए दूसरे में उस चर का उपयोग कर सकता हूं?xslt वैरिएबल स्कोप और इसका उपयोग

किसी भी विचार की अत्यधिक सराहना की जाएगी।

धन्यवाद

उत्तर

13

वहाँ किसी भी तरह से मैं सिर्फ वैश्विक संगठन घोषित कर सकते हैं है एल वैरिएबल फिर लूप के लिए पहले मान असाइन करें और लूप के लिए दूसरे में उस चर का उपयोग करें?

तरह से एक 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 से इसका मूल्य है।

फिर 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 
+0

तो मुझे बाद में उपयोग करने के लिए दो अलग-अलग फ़ील्ड का मूल्य कैसे प्राप्त होगा? – Julian

+0

बस दो चर परिभाषित करें और प्रत्येक को "फ़ील्ड" में प्रारंभ करें। "बाद में" के बारे में - एक कार्यात्मक भाषा में ऐसी कोई बात नहीं है। मूल्यांकन किसी भी क्रम में और/या समानांतर में हो सकता है –

0

xsl:for-each भावना for या foreach छोरों प्रक्रियात्मक भाषाओं में मौजूद हैं में एक पाश इसलिए किसी भी प्रश्न छोरों के बारे में बात को समझने में मुश्किल और जवाब देने के लिए और अधिक कठिन है नहीं है।

यदि आप एक्सएसएलटी में वैश्विक चर का उपयोग करना चाहते हैं तो आप ऐसा कर सकते हैं लेकिन आप वैरिएबल के लिए एक मान बांधेंगे जहां आप इसे घोषित करते हैं (यानी वैश्विक रूप से), आप बाद में for-each में मान निर्दिष्ट नहीं कर सकते करना चाहते हैं

0
  1. आपने लिखा है, 'XSL एक प्रक्रियात्मक लैंग है' .. ठीक है, इसकी नहीं। यह घोषणात्मक भाषा ..
  2. परिवर्तनीय इसकी घोषणा के साथ असाइन किया गया है, चर बदल नहीं है!
  3. आमतौर पर हम call-template उन्हें पैरामीटर गुजर का उपयोग कर टेम्पलेट्स के लिए पुनरावर्ती कॉल .. का पालन
    मायने रखता है संभाल करने के लिए एक तरीका है कि और सशर्त पाशन आदि (इस प्रक्रियात्मक भाषाओं में गुजर तर्क के साथ बुला पुनरावर्ती क्रिया की तरह काम करता है) ..

हम आपकी सहायता करने में खुशी होगी बैठाना यदि आप नमूना XML के साथ सटीक परिदृश्य, और आउटपुट आप इससे बाहर उम्मीद कर रहे हैं :) उल्लेख

+0

यह 3 साल पहले है पता लेकिन उन्होंने लिखा है * मैं जानता हूँ कि xslt एक प्रक्रियात्मक भाषा नहीं है * ... – LuckyLikey

+1

@LuckyLikey, प्रश्न के इतिहास संपादित जाँच, दिमित्री यह सही है। इससे पहले यह था "मुझे पता है कि एक्सएसएलटी एक प्रक्रियात्मक भाषा है" –

+0

आपको सही .. मुझे खेद है कि +1 +1 – LuckyLikey