2010-07-27 17 views
24

में एक मान बढ़ाना मैं xlst के लिए बिल्कुल नया हूं और इस बात के बारे में उलझन में हूं कि कोई मूल्य स्टोर करने और इसे बाद में बदलने का कोई तरीका है, उदाहरण के लिए एक लूप में एक चर को बढ़ाएं।एक्सएसएलटी

मैं थोड़ा सा परेशान हूं, इसके सेट के बाद के मूल्य को बदलने में सक्षम नहीं होने से मुझे समझ में नहीं आ रहा है, जिससे यह लगातार स्थिर हो जाता है।

उदाहरण के लिए मैं इस तरह कुछ करना चाहता हूँ:

<xsl:variable name="i" select="0" /> 
<xsl:for-each select="data/posts/entry"> 
    <xsl:variable name="i" select="$i + 1" /> 
    <!-- DO SOMETHING --> 
</xsl:for-each> 

किसी को भी है कि क्या वहाँ इस
धन्यवाद

+0

धन्यवाद डिमिट्रे, मुझे एहसास नहीं हुआ कि प्रत्येक लूप के लिए चर का पुन: उपयोग किया जा सकता है।मेरी समस्या वास्तव में मेरे द्वारा पोस्ट किए गए उदाहरण की तुलना में बहुत अधिक जटिल थी और मुझे रिकर्सन का उपयोग करके एक समाधान मिला, हालांकि मैं आपके सुझाव – DonutReply

+1

@ ओलिवर का उपयोग करके एक और अधिक सुरुचिपूर्ण समाधान देखता हूं, जबकि रिकर्सन कुछ सार्वभौमिक है, फिर से रिकर्सन को बदलने के तरीके हैं यात्रा। यह परिणाम अनुकूलित - समय और स्थान दोनों के लिए - xslt अनुप्रयोगों। –

उत्तर

28

XSLT एक कार्यात्मक भाषा है और अन्य बातों के अलावा इसका मतलब यह है XSLT में चर हैं कि अपरिवर्तनीय और ओएनसी ई उन्हें परिभाषित किया गया है कि उनके मूल्य को बदला नहीं जा सकता है।

<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="/"> 
    <posts> 
    <xsl:for-each select="data/posts/entry"> 
     <xsl:variable name="i" select="position()" /> 
     <xsl:copy> 
     <xsl:value-of select="concat('$i = ', $i)"/> 
     </xsl:copy> 
    </xsl:for-each> 
    </posts> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव निम्नलिखित XML दस्तावेज़ पर लागू किया जाता है:

<data> 
<posts> 
    <entry/> 
    <entry/> 
    <entry/> 
    <entry/> 
    <entry/> 
</posts> 
</data> 

परिणाम है

यहाँ कैसे एक ही प्रभाव XSLT में प्राप्त किया जा सकता है :

<posts> 
    <entry>$i = 1</entry> 
    <entry>$i = 2</entry> 
    <entry>$i = 3</entry> 
    <entry>$i = 4</entry> 
    <entry>$i = 5</entry> 
</posts> 
1

मुझे लगता है कि अपने आप को दो साल में भाग करने के लिए एक वैकल्पिक तरीका है पर मुझे प्रबुद्ध कर सकते हैं पहले। इसके लिए आपको रिकर्सन का उपयोग करने की आवश्यकता है। मैं सटीक सिंटैक्स भूल जाते हैं, लेकिन इस साइट मदद कर सकता है:

Tip: Loop with recursion in XSLT

रणनीति मूल रूप से काम करता है: एक टेम्पलेट "विधि" के साथ for पाश बदलें। इसे i पैरामीटर प्राप्त करें। टेम्पलेट विधि में for पाश का शरीर करें। यदि i > 0 पैरामीटर के रूप में i - 1 के साथ टेम्पलेट विधि को फिर से (रिकर्सन) पर कॉल करें।

स्यूडोकोड:

for i = 0 to 10: 
    print i 

हो जाता है:

def printer(i): 
    print i 
    if i < 10: 
     printer(i + 1) 
printer(0) 

कृपया ध्यान दें कि एक xsl:for-each में position() का उपयोग कर (अन्य उत्तर देखें) आसान हो सकता है अगर सभी आप क्या करना चाहते है एक चर वेतन वृद्धि की है। अगर आप अधिक जटिल लूप/हालत चाहते हैं तो यहां पुनरावृत्ति के प्रकार का उपयोग करें।

5

आप position() फ़ंक्शन का उपयोग कर सकते हैं:

<xsl:for-each select="data/posts/entry"> 
    <xsl:text> 
    Postion: ' 
    </xsl:text> 
    <xsl:value-of select = "position()" /> 
    <xsl:text> 
    ' 
    </xsl:text> 
    <!-- DO SOMETHING --> 
</xsl:for-each>