XML + XSL: Samma element flera gånger?

Trädvy Permalänk
Medlem
Plats
Valbo
Registrerad
Aug 2002

XML + XSL: Samma element flera gånger?

Jag har ett XML dokument med en elementstruktur som jag vill visa två gånger, fast lite olika.

<?xml version... ?> <root> <data> <head><project>123456</project><title>Projekttitel</title></head> <index> <group id="1" title="Pärm 1 abc"> <tab index="1">Text för index 1</tab> <tab index="2">Text för index 2</tab> <tab index="3">Text för index 3</tab> </group> <group id="2" title="Pärm 2 def"> <tab index="4">Text för index 4</tab> <tab index="5">Text för index 5</tab> <tab index="6">Text för index 6</tab> </group> </index> </data> <binders> <binder id="1"> <grey id="2" /> </binder> <binder id="2"> <grey id="1" /> </binder> </binders> </root>

Det är för pärmindex och resultatet ska bli liknande detta:

Dvs. ett papper för "Pärm 1" delen och ett papper för "Pärm 2" delen. Sedan är gruppbakgrund grå för det som finns inte finns i aktuell pärm.

Så det jag vill göra är att klona <data> flera gånger (en för varje pärm) men samtidigt vill jag också kunna markera vilka av grupperna som ska vara grå i respektive pärm.

Det gick utmärkt att klona <data> flera gånger genom att loopa i <binders> men jag vet inte hur jag kan "komma ihåg" vilken sektion som ska vara grå.

XSL för att gå igenom element i <binders>

<xsl:for-each select="binders/*"> <div class="page"> <div class="content"> <xsl:call-template name="PageHead" /> <!-- LeftSide page header --> <xsl:call-template name="TabIndex" /> <!-- RightSide Tab index --> </div> <!-- End of content --> </div> <!-- End of Page --> </xsl:for-each>

Problemet är att så fort jag kommer in i "TabIndex" template så har jag tappat informationen om binder.

Desktop: | Core i5-4690K | Zotac GTX 970 | 16Gb RAM | 256Gb Samsung 830 SSD
NAS: HP Microserver Gen8 | 12GB DDR2 Ram | 3x1.5Tb ZFS | FreeNAS

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Aug 2010

Du kan alltid skicka med varje binder till din nya template, exempelvis såhär:

<xsl:template name="TabIndex"> <xsl:param name="binder"/> <xsl:copy-of select="$binder"/> <xsl:copy-of select="$binder"/> </xsl:template> <xsl:for-each select="binders/*"> <xsl:variable name="binderNode" select="."/> <div class="page"> <div class="content"> <xsl:call-template name="PageHead" /> <!-- LeftSide page header --> <xsl:call-template name="TabIndex"> <xsl:with-param name="binder" select="$binderNode"/> <!-- Eventuellt går det att göra select="." direkt här, beror lite på vilken XSL-processor du använder --> </xsl:call-template> </div> <!-- End of content --> </div> <!-- End of Page --> </xsl:for-each>

Alternativt så kan du ju kalla två olika templates, beroende på om de ska ha färg eller inte.

EDIT: Sen förstår jag inte riktigt, i ditt första exempel är det en HTML-struktur men i andra exemplet är det XML?

Du får gärna citera eller nämna mig (@ToJa92) om du svarar på något jag skrivit.

Trädvy Permalänk
Medlem
Plats
Valbo
Registrerad
Aug 2002

Vilket första och andra exempel? Resultatet av XML + XSL blir HTML

Läste på lite om xsl:variable historian och fixade lite andra templates, så nu utgår jag ifrån binders/* som ditt exempel där jag skapar HTML tabeller (och kan sätta bakgrundsfärg) etc. Sedan "anropar" jag template för /root/data/group/* och fyller tabellen med det. Ser ut att fungera

Nu ska jag "bara" modifiera min JS kod så den sparar på rätt sätt

Desktop: | Core i5-4690K | Zotac GTX 970 | 16Gb RAM | 256Gb Samsung 830 SSD
NAS: HP Microserver Gen8 | 12GB DDR2 Ram | 3x1.5Tb ZFS | FreeNAS