Peter: XSLT Tags gruppieren

Beitrag lesen

Hi,

Wie kann ich mit XSLT apply-templates so verwenden, dass die Elemente nach Tags gruppiert werden und über bestimmte Gruppen ein übergeordneter Tag eingefügt wird (aber nur wenn Kindelemente gefunden wurden!)?

Bsp:

<Root>
  <Heading Name="Ich bin eine normale Überschrift">
    <R ID="1" />
    <R ID="2" />
    <R ID="3" />
    <Heading Type="Node" Name="Subnode">
      <Heading Type="Node" Name="SubSubNode">
        <R ID="x0"/>
        <Heading Name="Unterüberschrift">
          <R ID="x1"/>
          <R ID="x2"/>
          <R ID="x3"/>
        </Heading>
        <R ID="x4"/>
      </Heading>
    </Heading>
    <R ID="4" />
    <R ID="5" />
    <Heading Type="Node" Name="Empty Subnode">
    </Heading>
  </Heading>
</Root>

Alle Heading die nicht Type="Node" sind sollen ignoriert werden. Für den Rest soll die Struktur erhalten bleiben. Dabei sollen alle <R> Elemente einer Hierarchie zuerst zusammengefasst werden, falls in der Hierarchie Elemente existieren, mit <RS></RS> umschlossen werden und danach ggf. Unterknoten geschrieben werden. Also:

<Scope>
  <RS>
    <R ID="1" />
    <R ID="2" />
    <R ID="3" />
    <R ID="4" />
    <R ID="5" />
  </RS>

<Scope Name="Subnode">
    <Scope Name="SubSubNode">
      <RS>
        <R ID="x0"/>
        <R ID="x1"/>
        <R ID="x2"/>
        <R ID="x3"/>
        <R ID="x4"/>
      </RS>
    </Scope>
  </Scope>
  <Scope Name="Empty Subnode"/>
</Scope>

Mein XSL sieht so aus:

<xsl:template match="/Root">
  <Scope>
    <RS> <!-- RS soll nur erstellt werden, wenn es Kinder gibt! -->
       <xsl:apply-templates select="//R" />
    </RS>
    <xsl:apply-templates />
  </Scope>
</xsl:template>

<xsl:template match="//Heading[@Type != 'Node']">
  <RS>
    <xsl:apply-templates />
  </RS>
</xsl:template>

<xsl:template match="//Heading[@Type = 'Node']">
  <Scope>
    <xsl:attribute name="Name">
      <xsl:value-of select="@Name"/>
    </xsl:attribute>
    <xsl:apply-templates />
  </Scope>
</xsl:template>

<xsl:template match="//R">
  <xsl:copy-of select="."/>
</xsl:template>

Wie bringe ich das richtig hin?

LG
Peter