Een DOM Document met de volgende inhoud wordt gegenereerd om binnen een webapplicatie verwerkt te worden via XSLT:
Hier de XSLT code. De EXSLT functie die uitgevoerd wordt is simpelweg het genereren van de tabelrij (zoals de naam al doet vermoeden).
Wat het bovenstaande moet doen is de groepsnaam en een <table>-tag weergeven, wanneer deze verschilt van de groepsnaam van de vorige 'property', of wanneer er geen voorgaande 'property' is. De tabel moet gesloten worden wanneer de groepsnaam van de volgende 'property' verschilt van de huidige, of wanneer en geen volgende 'property' bestaat.
Het resultaat zou dus moeten zijn:
De choose-constructie opzich werkt ook prima en is slechts bedoeld op het probleem even te illustreren.
Het probleem is dat het bovenstaande niet wordt geaccepteerd als zijnde correcte XML syntax, aangezien de table-tags verdeeld zijn over twee condities. Mijn vraag is; hoe zou ik dit op kunnen lossen?
Alle suggesties zijn welkom. Het aanpassen van de XML-inhoud heeft echter minder mijn voorkeur, omdat de handeling m.i. presentatielogica is, die in een XSL-bestand afgehandeld zou moeten kunnen worden.
XML:
1
2
3
4
5
6
7
8
9
10
11
12
| <property group="Groep 1"> <name>Naam 1</name> <value>Waarde 2</value> </property> <property group="Groep 1"> <name>Naam 2</name> <value>Waarde 2</value> </property> <property group="Groep 2"> <name>Naam 3</name> <value>Waarde 3</value> </property> |
Hier de XSLT code. De EXSLT functie die uitgevoerd wordt is simpelweg het genereren van de tabelrij (zoals de naam al doet vermoeden).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <xsl:for-each select="property">
<xsl:choose>
<xsl:when test="preceding-sibling::*[@group][1]/@group != ./@group or not(preceding-sibling::*)">
<h3><xsl:value-of select="./@group"/></h3>
<table class="infotable">
<xsl:copy-of select="my:renderPropertiesRow('searchHeader')"/>
</xsl:when>
<xsl:when test="following-sibling::*[@group][1]/@group != ./@group or not(following-sibling::*)">
<xsl:copy-of select="my:renderPropertiesRow('searchHeader')"/>
</table>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="my:renderPropertiesRow('searchHeader')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each> |
Wat het bovenstaande moet doen is de groepsnaam en een <table>-tag weergeven, wanneer deze verschilt van de groepsnaam van de vorige 'property', of wanneer er geen voorgaande 'property' is. De tabel moet gesloten worden wanneer de groepsnaam van de volgende 'property' verschilt van de huidige, of wanneer en geen volgende 'property' bestaat.
Het resultaat zou dus moeten zijn:
HTML:
1
2
3
4
5
6
7
8
| <h3>Groepsnaam 1</h3> <table class="infotable"> [info van eerste en tweede 'property'] </table> <h3>Groepsnaam 2</h3> <table class="infotable"> [info van derde 'property'] </table> |
De choose-constructie opzich werkt ook prima en is slechts bedoeld op het probleem even te illustreren.
Het probleem is dat het bovenstaande niet wordt geaccepteerd als zijnde correcte XML syntax, aangezien de table-tags verdeeld zijn over twee condities. Mijn vraag is; hoe zou ik dit op kunnen lossen?
Alle suggesties zijn welkom. Het aanpassen van de XML-inhoud heeft echter minder mijn voorkeur, omdat de handeling m.i. presentatielogica is, die in een XSL-bestand afgehandeld zou moeten kunnen worden.