In mijn XSL pagina loop ik door een XML structuur die een aantal categorieën met daaronder "downloads" bevat. Wat ik wil, is de laatste drie toegevoegde uploads selecteren met hun categorie namen.
Ik zit in een for-each loop door een XML file:
Om een goede categorie naam weg te schrijven in mijn tabel gebruik ik de "preceding-sibling" in xpath. De naam van de voorgaande categorie heb ik nodig om te kunnen beslissen of ik een "kop" wil gaan schrijven voor mijn tabel... om te voorkomen dat ik voor twee downloads - die onder dezelfde categorie vallen - twee dezelfde koppen schrijf.
Als je dit gaat uitleggen zou ik zeggen dat hier het volgende gebeurt:
Ga twee lagen terug om bij de categorieën te komen. Selecteer daarna alle voorgaande siblings waar in ieder geval een naam beschikbaar is. Pak de eerst voorgaande node. Selecteer de naam.
Dit gaat gewoonweg fout. Zodra ik niet door de downloads, maar alleen door de categorieën ga loopen, dan gaat dit wel goed (zonder de ../../ natuurlijk.)
Alleen... dit wil ik niet, ik moet door de downloads loopen om er maximaal drie uit te halen.
Maargoed, dat is van latere zorg dacht ik. Ik ging hierna verder met testen. Ik haalde alle xsl:sorts weg, verwijderde alle code die door de downloads loopten en ik ging loopen door de categorieën, en kreeg nu de goede nodes e.d. terug. Heel fijn. Het werkt dus wel, er is gewoon iets anders verkeerd.
Nu wilde ik de categorieën gaan sorteren op naam.
En hier gaat het helemaal fout. De variabele die ik wil opbouwen houdt zich aan de XML file structuur, NIET aan de structuur die ik heb verkregen danzij de "xsl:sort" functionaliteit.
Heeft iemand een idee om een tabel te maken met XML en XSL gesorteerd op "download" niveau met de categorie namen erboven?
Dus:
Wat ik nu voorelkaar krijg is:
Wat natuurlijk niet logisch overkomt naar de gebruiker...
Het probleem lijkt dus te zijn dat de proceeding-sibling mogelijkheid de originele XML stream gebruikt, ongesorteerd. Zodra ik ga sorteren wordt de volgorde in de loop wel aangepast, maar alle tussenliggende variabelen e.d. trekken zich er niks van aan.
Kan iemand me verder helpen? Dit moet toch verschrikkelijk makkelijk zijn... volgens mij denk ik gewoon verkeerd.
Ik gebruik de laatste MSXML4.0 processor.
Mijn XML voorbeeld:
Ik zit in een for-each loop door een XML file:
code:
1
2
| <xsl:for-each
select="//data[@table='categorie']/row/data[@table='downloads']/row"> |
Om een goede categorie naam weg te schrijven in mijn tabel gebruik ik de "preceding-sibling" in xpath. De naam van de voorgaande categorie heb ik nodig om te kunnen beslissen of ik een "kop" wil gaan schrijven voor mijn tabel... om te voorkomen dat ik voor twee downloads - die onder dezelfde categorie vallen - twee dezelfde koppen schrijf.
code:
1
2
| <xsl:variable name="prevcatname"
select="../../preceding-sibling::*[naam][1]/naam" /> |
Als je dit gaat uitleggen zou ik zeggen dat hier het volgende gebeurt:
Ga twee lagen terug om bij de categorieën te komen. Selecteer daarna alle voorgaande siblings waar in ieder geval een naam beschikbaar is. Pak de eerst voorgaande node. Selecteer de naam.
Dit gaat gewoonweg fout. Zodra ik niet door de downloads, maar alleen door de categorieën ga loopen, dan gaat dit wel goed (zonder de ../../ natuurlijk.)
Alleen... dit wil ik niet, ik moet door de downloads loopen om er maximaal drie uit te halen.
Maargoed, dat is van latere zorg dacht ik. Ik ging hierna verder met testen. Ik haalde alle xsl:sorts weg, verwijderde alle code die door de downloads loopten en ik ging loopen door de categorieën, en kreeg nu de goede nodes e.d. terug. Heel fijn. Het werkt dus wel, er is gewoon iets anders verkeerd.
Nu wilde ik de categorieën gaan sorteren op naam.
En hier gaat het helemaal fout. De variabele die ik wil opbouwen houdt zich aan de XML file structuur, NIET aan de structuur die ik heb verkregen danzij de "xsl:sort" functionaliteit.
Heeft iemand een idee om een tabel te maken met XML en XSL gesorteerd op "download" niveau met de categorie namen erboven?
Dus:
code:
1
2
3
4
5
6
| CATEGORIE 1
download 1
CATEGORIE 2
download 2
download 3 |
Wat ik nu voorelkaar krijg is:
code:
1
2
3
4
5
6
7
8
| CATEGORIE 1
download 1
CATEGORIE 2
download 2
CATEGORIE 2
download 3 |
Wat natuurlijk niet logisch overkomt naar de gebruiker...
Het probleem lijkt dus te zijn dat de proceeding-sibling mogelijkheid de originele XML stream gebruikt, ongesorteerd. Zodra ik ga sorteren wordt de volgorde in de loop wel aangepast, maar alle tussenliggende variabelen e.d. trekken zich er niks van aan.
Kan iemand me verder helpen? Dit moet toch verschrikkelijk makkelijk zijn... volgens mij denk ik gewoon verkeerd.
Ik gebruik de laatste MSXML4.0 processor.
Mijn XML voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| <data table="categorie">
<row id="1">
<naam>PSA OPLOSSINGEN</naam>
<files/>
<data table="uploads">
<row id="1">
<naam>PSA Lorem ipsum dolor sit amet</naam>
<datumtijd>28-08-2003 16:55:52</datumtijd>
<omschrijving>Duis vel illum dolore eu feugiat nulla facilisis.</omschrijving>
</row>
<row id="2">
<naam>Dit is nog een test</naam>
<datumtijd>28-08-2003 17:25:21</datumtijd>
<omschrijving>Duis vel illum dolore eu feugiat nulla facilisis.</omschrijving>
</row>
</data>
</row>
<row..
<row..
<row..
<row..
</data>
<data..
<row.. |