2008-09-18 16 views
80

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

<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> 

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

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

उत्तर

130

position() उम्मीद करनी चाहिए। उदा .:

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

विशेषता मान –

+6

करने के लिए एक बंद करने वाला उद्धरण "जोड़ने की आवश्यकता है जब तक आप XSL की तरह एक फिल्टर जोड़ने के लिए यह सब ठीक है और बांका: यदि आपके XSL के अंदर:। के लिए-प्रत्येक तब स्थिति() बेकार है और आपको उचित काउंटर की आवश्यकता है। –

+2

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

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> 
13

??? के स्थान पर <xsl:number format="1. "/><xsl:value-of select="."/><xsl:text> डालने की कोशिश करो।

"1." नोट करें - यह संख्या प्रारूप है। और जानकारी: here

+0

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

+0

एक्सएसएलटी 1.0 संस्करण: '' – jsuddsjr

5

प्रयास करें:

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

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

+1

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

5

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

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

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

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

संबंधित मुद्दे