2010-07-19 18 views
5

Alfabeyi a-z ile yinelemeli ve her biri için harfi yazdırmalı ve sonra veritabanımda, o harfle başlayan tüm öğeleri görüntülemek için çalıştığım bazı kodları yerleştirin. Şu anda, görüntülediğim tüm öğe adlarının ilk harfini almak için bir seçim yapıyorum. Ancak, gereksinim tüm harfleri görüntülemektir ve sonra öğelerin olmadığı 'gösterilecek öğe gösterilmemelidir. Bu yüzden, artık sadece öğeleri olan harfleri döndüren seçimimi kullanamıyorum.xsl alfabesiyle yineleyin

Bunu, her harfi kod yazmadan ve sonra şablonumu 26 kez çağırdıktan sonra nasıl yapabilirim?

+2

İyi soru (+1). Bir XSLT 1.0 çözümü için cevabımı görün. –

cevap

5

Bu dönüşüm:

<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> 
bu XML belge üzerinde uygulanan

("veritabanı" rolünü oynayan):

:

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

istenilen sonuca üretir

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

İyi cevap! Ve "sen-cehenneme-kullan-kullan-kullan" sabit yineleme kalıbı için +1. Ancak, alfabe sadece orada. Öyleyse, sanırım "her birinden 26 kez şablonumu çağırarak" tekrarlama ile yanlış bir şey olmadığını belirtmek iyi bir şey. –