2010-07-19 11 views
5

मुझे वर्णमाला ए-जेड के माध्यम से पुनरावृत्ति करने की आवश्यकता है, और प्रत्येक के लिए, पत्र मुद्रित करें, और उसके बाद कुछ कोड रखें जो मैं पहले से ही अपने डेटाबेस में सभी आइटम प्रदर्शित करने के लिए काम कर रहा हूं जो उस पत्र से शुरू होता है। वर्तमान में, मैं प्रदर्शित होने वाले सभी आइटम नामों का पहला अक्षर पुनर्प्राप्त करने के लिए एक चयन का उपयोग कर रहा हूं। हालांकि, सभी अक्षरों को प्रदर्शित करने की आवश्यकता है, और उसके बाद 'प्रदर्शित करने के लिए कोई आइटम' नहीं दिखाएं जहां कोई आइटम नहीं है। इसलिए, अब मैं अपने चयन का उपयोग नहीं कर सकता, जो केवल उन अक्षरों को लौटाता है जिनमें आइटम हैं।वर्णमाला की सूची के माध्यम से xsl iterate

मैं यह कैसे कर सकता हूं, प्रत्येक पत्र को हार्डकोड किए बिना, और फिर मेरे टेम्पलेट को प्रत्येक के बाद 26 बार कॉल करना?

+2

अच्छा प्रश्न (+1)। एक एक्सएसएलटी 1.0 समाधान के लिए मेरा जवाब देखें। –

उत्तर

5

यह परिवर्तन:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" > 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kItemBy1stLetter" match="item" 
    use="substring(.,1,1)"/> 

<xsl:variable name="vDoc" select="/"/> 

<xsl:variable name="vAlphabet" select= 
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" 
/> 

<my:message>No items found.</my:message> 

<xsl:variable name="vMessage" select="document('')/*/my:message"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "(document('')//node()|document('')//@*|document('')//namespace::*) 
          [ not(position() > 26)] 
    "> 

    <xsl:variable name="vcurLetter" select= 
     "substring($vAlphabet, position(), 1)"/> 
    <xsl:for-each select="$vDoc"> 
     <xsl:variable name="vSearchResult" select= 
     "key('kItemBy1stLetter', $vcurLetter)"/> 

     <xsl:value-of select="concat('&#xA;',$vcurLetter, ': &#xA;')"/> 

     <xsl:copy-of select="$vSearchResult | $vMessage[not($vSearchResult)]/text()"/> 
     </xsl:for-each> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

जब इस XML दस्तावेज़ पर लागू ("डेटाबेस" की भूमिका निभा):

:

<database> 
<item>Bicycles</item> 
<item>Computers</item> 
<item>Cars</item> 
<item>Forks</item> 
<item>Gellato</item> 
<item>Hypervehicles</item> 
<item>Ichtiosaurs</item> 
<item>Jobs</item> 
<item>Knots</item> 
<item>Lens</item> 
<item>Miracles</item> 
<item>Notes</item> 
</database> 

वांछित परिणाम का उत्पादन

A: 
No items found. 

B: 
<item>Bicycles</item> 

C: 
<item>Computers</item> 
<item>Cars</item> 

D: 
No items found. 

E: 
No items found. 

F: 
<item>Forks</item> 

G: 
<item>Gellato</item> 

H: 
<item>Hypervehicles</item> 

I: 
<item>Ichtiosaurs</item> 

J: 
<item>Jobs</item> 

K: 
<item>Knots</item> 

L: 
<item>Lens</item> 

M: 
<item>Miracles</item> 

N: 
<item>Notes</item> 

O: 
No items found. 

P: 
No items found. 

Q: 
No items found. 

R: 
No items found. 

S: 
No items found. 

T: 
No items found. 

U: 
No items found. 

V: 
No items found. 

W: 
No items found. 

X: 
No items found. 

Y: 
No items found. 

Z: 
No items found. 
+1

अच्छा जवाब! और "आप-करेंगे-जाने-जाने-नरक-अगर-आप-उपयोग-यह" के लिए +1 पुनरावृत्ति पैटर्न के लिए +1। लेकिन, वर्णमाला बस वहां है। इसलिए, मुझे लगता है कि यह एक अच्छी बात है कि यह कहने के लिए कि "मेरे टेम्पलेट को प्रत्येक के बाद 26 बार कॉल करने" में कुछ भी गलत नहीं है। –

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