[xslt] sortowanie alfabetyczne

0

witam,
posiadam plik xml z wpisami w formie:

<tabela>
 
 <osoba>
  
  <imie>Jan</imie>
  <naz>Kowalski</naz>
  <plec>m</plec>
  <nr>44</nr>
  <odl>30</odl>
  <kier>N</kier>
 
 </osoba>
</tabela>
 

i probuje posortowac w nim wpisy alfabetycznie jednak robiac dla kazdej litery osobna tabele
robie to w ten sposob:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"           

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"   
     omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <html>
       <head><title>example</title></head>
    <body>
    
    <table border="1">
       <tr>
       <td>Imie</td>
         <td>Naziwsko</td>
         <td>Plec</td>
         <td>Numer buta</td>
         <td>Kilometry od Poznania</td>
         <td>Kierunek</td>
       </tr>
       <xsl:for-each select="tabela/osoba">
     <xsl:if test="starts-with(naz,'A')">
       <tr>
         <td><xsl:value-of select="imie"/></td>
         <td><xsl:value-of select="naz"/></td>
         <td><xsl:value-of select="plec"/></td>
        <td><xsl:value-of select="nr"/></td>
        <td><xsl:value-of select="odl"/></td>         
        <td><xsl:value-of select="kier"/></td>
         </tr>    
         </xsl:if>
         </xsl:for-each>
         </table>
         <br/>
<table border="1">
       <tr>
       <td>Imie</td>
         <td>Naziwsko</td>
         <td>Plec</td>
         <td>Numer buta</td>
         <td>Kilometry od Poznania</td>
         <td>Kierunek</td>
       </tr>
       <xsl:for-each select="tabela/osoba">
     <xsl:if test="starts-with(naz,'B')">
       <tr>
         <td><xsl:value-of select="imie"/></td>
         <td><xsl:value-of select="naz"/></td>
         <td><xsl:value-of select="plec"/></td>
        <td><xsl:value-of select="nr"/></td>
        <td><xsl:value-of select="odl"/></td>         
        <td><xsl:value-of select="kier"/></td>
         </tr>    
         </xsl:if>
         </xsl:for-each>
         </table>
    </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

jednak bedzie to duuuza ilosc kodu + fakt pojawiania sie pustych tabel w przypadku braku nazwiska na dana litere
jak zrobic to sprytniej?

0

będę wredny ;)

<xsl:for-each select="tabela/osoba">
<xsl:sort select="nazwisko">
<!-- tu wypisujesz w potrzebnym formacie dane -->
</xsl:for-each>

pozdrawiam

0

ekhm... wiem ze to mi wypisze posortowane dane ale jak mam utworzyc osobne tabele dla kazdej litery?
podany kod wysweitli mi tylko posortowane dane wedlug naziwska,
ewentualnie jesli dodam sobie tabelke to beda one wszystkie w jednej tabelce
mi chodzi o wyrazne podzielenie na osobne tabele dla nazwiska na A (jezeli sa nazwiska na A) B... itd

0

Hm... można jeszcze sprawdzać za pomocą count() (http://www.zvon.org/xxl/XSLTutorial/Output_pol/example51_ch13.html) czy zbiór nie jest pusty jeżeli ma jakieś elementy to wypisywać.

0

ale jak zaznaczyc ten zbior?
juz wczesniej nad tym myslalem ale starts-with(naz,'B') zwraca mi tylko true/false
jak wyluskac liczbe samych nazwisk na litere B?

0

To nie jest gotowe rozwiązanie, ale propozycja do sprawdzenia:
zrób pętlę jak podał Koziołek, tam gdzie jest miejsce na wpisanie danych wypisuj wiersze tabeli, ale przedtem dodaj instrukcję, która zakończy tabelę i rozpocznie nową. To zakończenie i rozpoczęcie tabeli ma się pojawiać warunkowo, tylko wtedy, kiedy początek nazwiska jest inny niż poprzedni. Sprawdzenie tego warunku powinno się opierać na zapisie ostatniej pierwszej litery w jakiejś zmiennej <param name=... (i nad tym się nie zastanawiałem, czy się da). Przed pętlą powinno być otwarcie tabeli, a za pętlą zamknięcie. Jeżeli to zadziała, to odchodzi też problem pustych tabel.
Mam nadzieję, że da się zrozumieć to, co napisałem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1