2010-07-19 11 views
5

Ho bisogno di scorrere l'alfabeto a-z, e per ognuno, stampare la lettera, e quindi inserire un codice che ho già funzionante per visualizzare tutti gli elementi nel mio database che iniziano con quella lettera. Attualmente, sto usando una selezione per recuperare la prima lettera di tutti i nomi degli oggetti che mostro. Tuttavia, il requisito è quello di visualizzare tutte le lettere e quindi mostrare 'nessun elemento da visualizzare' dove non ci sono elementi. Quindi, non posso più usare la mia selezione, che restituisce solo le lettere che contengono elementi.xsl scorrere l'elenco dell'alfabeto

Come posso fare questo, senza scrivere manualmente ogni lettera, e poi chiamare il mio modello 26 volte dopo ciascuna?

+2

Buona domanda (+1). Vedi la mia risposta per una soluzione XSLT 1.0. –

risposta

5

Questa trasformazione:

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

se applicato su questo documento XML (nel ruolo di "banca dati"):

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

produce il risultato voluto:

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

Buona risposta! E +1 per il pattern di iterazione fisso "you-will-go-to-hell-if-you-use-it". Ma l'alfabeto è lì. Quindi, penso che sia una buona cosa sottolineare che non c'è niente di sbagliato in "chiamare il mio modello 26 volte dopo ogni" con ricorsione. –