Bereich Gruppieren

lexmex_83

Grünschnabel
Hallo zusammen

Bin auf ein neues Thema gestossen - Bereich Gruppieren, aber mit "spezialbedingungen"


Ich habe eine XML (konvertiert aus einer CSV) wo so aussieht:

Code:
<CSV>
	<ORD number="5">
		<A>AAAAAA</A>
		<B>123</B>
	</ORD>
	<NAP number="6">
		<A>123</A>
		<B>123</B>
	</NAP>
	<NAS number="7">
		<A>123</A>
		<B>123</B>
	</NAS>
	<NAR number="8">
		<A>123</A>
		<B>123</B>
	</NAR>
	<ORI number="9">
		<A>123</A>
		<B>123</B>
	</ORI>


	<ORD number="10">
		<A>BBBBBB</A>
		<B>123</B>
	</ORD>
	<NAP number="11">
		<A>123</A>
		<B>123</B>
	</NAP>
	<NAS number="12">
		<A>123</A>
		<B>123</B>
	</NAS>
	<NAR number="13">
		<A>123</A>
		<B>123</B>
	</NAR>
	<ORI number="14">
		<A>123</A>
		<B>123</B>
	</ORI>


	<ORD number="15">
		<A>CCCCCC</A>
		<B>123</B>
	</ORD>
	<NAP number="16">
		<A>123</A>
		<B>123</B>
	</NAP>
	<NAS number="17">
		<A>123</A>
		<B>123</B>
	</NAS>
	<NAR number="18">
		<A>123</A>
		<B>123</B>
	</NAR>
	<ORI number="19">
		<A>123</A>
		<B>123</B>
	</ORI>
</CSV>

Ich möchte nun ein XML ausgeben, wo eine Gruppierung nach "ORD" macht. D.h.

In diesem Beispiel gibt es drei "ORD's". und pro ORD möchte ich eine Gruppe bilden. In der Gruppe je ORD sind alle nachfolgenden Tag's drinn, bis zum nächsten ORD.

Kriegt man das hin irgendwie? Ich kenne nur das übliche "for each group":

Code:
<xsl:for-each-group select="****" group-by="****" >
<blabla></blabla>
</xsl:for-each-group>


Hatte jemand schon einen solchen Fall?


Gruss
 
Benutze "group-starting-with":

Code:
<xsl:template match="CSV">
  <xsl:for-each-group select="*" group-starting-with="ORD">
    <meine-gruppe>
      <xsl:copy-of select="current-group()"/>
    </meine-gruppe>
  </xsl:for-each-group>
</xsl:template>
 

lexmex_83

Grünschnabel
supper! genial! kann ich das dan in ein Template laden und aus diesem Template mit der erstellten Struktur weiterarbeiten?
 
Sicher, mit XSLT 2.0 (und for-each-group setzt ja einen XSLT 2.0-Prozessor voraus) kann man beliebig Strukturen speichern und weiterverarbeiten, etwa

Code:
<xsl:template match="CSV">
  <xsl:variable name="gruppen">
    <xsl:for-each-group select="*" group-starting-with="ORD">
     <meine-gruppe>
       <xsl:copy-of select="current-group()"/>
     </meine-gruppe>
    </xsl:for-each-group>
  </xsl:variable>
  <xsl:apply-templates select="$gruppen/meine-gruppe"/>
</xsl:template>

<xsl:template match="meine-gruppe">...</xsl:template>

Nimm dir mal die Zeit, im Web existierende Beispiele wie http://www.w3.org/TR/xslt20/#grouping-examples zu lesen und nachzuvollziehen, dann fällt die Benutzung von "for-each-group" auch leichter.