काउंटर अंदर xsl: प्रत्येक लूप के लिए


89

एक्सएसएल के अंदर एक काउंटर कैसे प्राप्त करें: प्रत्येक लूप के लिए जो संसाधित तत्व की संख्या को प्रतिबिंबित करेगा।
उदाहरण के लिए मेरा स्रोत XML है

<books>
    <book>
        <title>The Unbearable Lightness of Being </title>
    </book>
    <book>
        <title>Narcissus and Goldmund</title>
    </book>
    <book>
        <title>Choke</title>
    </book>
</books>

जो मैं पाना चाहता हूं वह है:

<newBooks>
    <newBook>
        <countNo>1</countNo>
        <title>The Unbearable Lightness of Being </title>
    </newBook>
    <newBook>
        <countNo>2</countNo>
        <title>Narcissus and Goldmund</title>
    </newBook>
    <newBook>
        <countNo>3</countNo>
        <title>Choke</title>
    </newBook>
</newBooks>

संशोधित करने के लिए XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
            <xsl:for-each select="books/book">
                <newBook>
                    <countNo>???</countNo>
                    <title>
                        <xsl:value-of select="title"/>
                    </title>
                </newBook>
            </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>

तो सवाल यह है कि क्या रखा जाए ??? क्या कोई मानक कीवर्ड है या क्या मुझे बस एक चर घोषित करना चाहिए और इसे लूप के अंदर बढ़ाना चाहिए?

जैसा कि सवाल बहुत लंबा है मुझे शायद एक पंक्ति या एक शब्द के उत्तर की उम्मीद करनी चाहिए :)

जवाबों:


141

position()। ईजी:

<countNo><xsl:value-of select="position()" /></countNo>

9
यह सब ठीक है और बांका है जब तक आपको xsl की तरह एक फिल्टर नहीं जोड़ना है: यदि आपके xsl के अंदर: प्रत्येक के लिए। तब स्थिति () USELESS है और आपको उचित काउंटर की आवश्यकता है।
माइक स्टारोव

4
@ माइक स्टावरोव यह सवाल का हिस्सा नहीं था! हर स्थिति को कवर नहीं कर सकते हैं
redsquare

@redsquare सही। बस मेरे दो सेंट जोड़ने। मुझे अपनी वर्णित स्थिति को हल करने के लिए एक XSL एक्सटेंशन फ़ंक्शन लिखना था। शायद मुझे यहां के लोगों से बेहतर समाधान के बारे में पूछना चाहिए।
माइक स्ट्रॉव

2
@MikeStarov तो कैसे करना है अगर xsl:ifअंदर है xsl:for-each? "उचित काउंटर" क्या है? क्या आप किसी संसाधन की ओर इशारा कर सकते हैं?
लजार्रे

@lajarre आप XSL से बुलाने के लिए एक कस्टम एक्सटेंशन फ़ंक्शन लिखते हैं। आप दो पास प्रोसेसिंग भी कर सकते हैं। एक बार प्रोसेस करें और xsl में सेव करें: वेरिएबल। फिर xsl वैरिएबल सामग्री पर टेम्प्लेट लागू करें और स्थिति का उपयोग करके नंबरिंग जोड़ें ()
माइक स्ट्रोव

13

<xsl:number format="1. "/><xsl:value-of select="."/><xsl:text>के स्थान पर सम्मिलित करने का प्रयास करें ???

"1." पर ध्यान दें - यह संख्या प्रारूप है। अधिक जानकारी: यहाँ


धन्यवाद, यह भी एक दिलचस्प पढ़ा है। मैं शायद उस दृष्टिकोण का उपयोग करूँगा जब कुछ प्रारूपण की आवश्यकता होती है
क्रिस्तोफ़

XSLT 1.0 संस्करण:<xsl:number format="1. " value="position()"/>
jsuddsjr

10

प्रयत्न:

<xsl:value-of select="count(preceding-sibling::*) + 1" />

संपादित करें - वहां एक मस्तिष्क स्थिर था, स्थिति () अधिक सीधी है!


3
फिर भी उपयोगी हो सकता है, खासकर यदि आप स्थिति () के अलावा अन्य मानदंडों के आधार पर चयन कर रहे हैं। +1
jsuddsjr

7

आप पोस्टऑन () पर सशर्त विवरण भी चला सकते हैं जो वास्तव में कई परिदृश्यों में सहायक हो सकता है।

उदाहरण के लिए।

 <xsl:if test="(position( )) = 1">
     //Show header only once
    </xsl:if>

2
यह विफल रहता है यदि आपके पास कोई फ़िल्टर है जैसे कि xsl: सॉर्ट करें क्योंकि तब पहला आइटम संसाधित होने वाला पहला नहीं हो सकता है।
एलेक्सिस विल्के

5
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
                <xsl:for-each select="books/book">
                        <newBook>
                                <countNo><xsl:value-of select="position()"/></countNo>
                                <title>
                                        <xsl:value-of select="title"/>
                                </title>
                        </newBook>
                </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.