Diese Lösung verwendet keine Rekursion und Hi-Lights ein paar nützliche XSLT-Techniken wie Muenchian Gruppierung, Schlüssel, Suche nach Maximum und Iteration ohne Rekursion.
Diese Transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kSectsByValue" match="SectionName"
use="."/>
<xsl:key name="kDocBySect" match="Document"
use="../SectionName"/>
<xsl:variable name="vCols" select=
"/*/*/SectionName
[generate-id()
=
generate-id(key('kSectsByValue',.)[1])
]"/>
<xsl:variable name="vMaxRows">
<xsl:for-each select="$vCols">
<xsl:sort data-type="number" order="descending"
select="count(key('kDocBySect', .))" />
<xsl:if test="position() = 1">
<xsl:value-of select="count(key('kDocBySect', .))"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:template match="/">
<table>
<tr>
<xsl:apply-templates select="$vCols"/>
</tr>
<xsl:for-each select=
"(/*/*/Document)[not(position() > $vMaxRows)]">
<tr>
<xsl:variable name="vPos" select="position()"/>
<xsl:for-each select="$vCols">
<td>
<xsl:value-of select=
"../Document[$vPos]/FileName"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="SectionName">
<td>
<xsl:value-of select="." />
</td>
</xsl:template>
</xsl:stylesheet>
, wenn sie auf dem ursprünglichen XML Dokument angewendet (korrigierter wohlgeformt werden):
<Documents>
<Section>
<SectionName>Green</SectionName>
<Document>
<FileName>Tier 1 Schedules</FileName>
</Document>
<Document>
<FileName>Tier 3 Schedules</FileName>
</Document>
<Document>
<FileName>Setback Schedule</FileName>
</Document>
<Document>
<FileName>Tier 2 Governance</FileName>
</Document>
</Section>
<Section>
<SectionName>MRO/Refurb</SectionName>
<Document>
<FileName>Tier 2 Governance</FileName>
</Document>
</Section>
</Documents>
erzeugt das gewünschte Ergebnis:
<table>
<tr>
<td>Green</td>
<td>MRO/Refurb</td>
</tr>
<tr>
<td>Tier 1 Schedules</td>
<td>Tier 2 Governance</td>
</tr>
<tr>
<td>Tier 3 Schedules</td>
<td/>
</tr>
<tr>
<td>Setback Schedule</td>
<td/>
</tr>
<tr>
<td>Tier 2 Governance</td>
<td/>
</tr>
</table>
Sie beachten Sie:
Wir verwenden die Muenchian method for grouping, um alle verschiedenen Spaltennamen zu finden, nicht, dass sie einzigartig werden im XML-Dokument zu verlassen.
Keys werden sowohl für die Münchische Gruppierung als auch für das Finden aller zu einer Spalte gehörenden Elemente verwendet.
Die maximale Anzahl der Zeilen ist und gehalten in der Variablen $vMaxRows
Wir iterieren N-mal fand die N Zeilen der Tabelle zu erzeugen - nicht Rekursion!
Die N
-ten Zeile ausgegeben von Vorlagen auf alle Spaltenelemente Anwendung dieser Position N
in ihrer Spalte.
Tabelle? Säule? Sie sind keine Standard-XML-Wörter. Du übersetzst was? XHTML? – bortzmeyer
@bortzmeyer: Ich denke, eine (X) HTML-Tabelle ist, was das OP ist. – Tomalak
Ich denke, du solltest meine Antwort noch nicht akzeptieren. Ich bin sicher, wenn Sie die Frage offen lassen, werden bessere Alternativen auftauchen. – Tomalak