ThomasM: XSLT-Gruppierung (keine Duplikate)

Beitrag lesen

Hallo Julian,

Jetzt fehlen mir einige meiner Knoten im XML, die Duplikate wurden jedoch korrekterweise entfernt.

Was hab ich hier falsch gemacht?

Das ist schon ein ziemlicher Stunt, sich in Deinen Code zu frickeln. Mein Ansatz konnte nicht genannte Teile der Struktur auch nicht berücksichtigen.

So sollte es passen (erzeugt bei fünf von neun entfernten Vierzeilern HeaderText bzw. LineText genau 20 Zeilen weniger):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>

  <xsl:key name="header_text" match="HeaderText" use="Text"/>
  <xsl:key name="line_text" match="LineText" use="Text"/>

  <!-- Identity-Template für die nicht explizit benannten Elemente -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="HeaderInformation">
    <HeaderInformation>
      <xsl:copy-of select="HeaderText[1]/preceding-sibling::*"/>
      <xsl:for-each select="HeaderText[generate-id() =
                            generate-id(key('header_text', Text)[1])]">
        <xsl:variable name="akt_key" select="Text"/>
        <xsl:variable name="akt_group" select="key('header_text', $akt_key)"/>
        <xsl:for-each select="$akt_group">
          <xsl:if test="position() = 1">
            <xsl:copy-of select="."/>
          </xsl:if>
        </xsl:for-each>
      </xsl:for-each>
      <xsl:copy-of select="HeaderText[last()]/following-sibling::*[following-sibling::LineItem]"/>
      <xsl:apply-templates select="LineItem"/>
      <xsl:copy-of select="LineItem/following-sibling::*"/>
    </HeaderInformation>
  </xsl:template>

  <xsl:template match="LineItem">
    <LineItem>
      <Lines>
        <xsl:copy-of select="Lines/LineText[1]/preceding-sibling::*"/>
        <xsl:for-each select="Lines/LineText[generate-id() =
                              generate-id(key('line_text', Text)[1])]">
          <xsl:variable name="akt_key" select="Text"/>
          <xsl:variable name="akt_group" select="key('line_text', $akt_key)"/>
          <xsl:for-each select="$akt_group">
            <xsl:if test="position() = 1">
              <xsl:copy-of select="."/>
            </xsl:if>
          </xsl:for-each>
        </xsl:for-each>
      </Lines>
    </LineItem>
  </xsl:template>

</xsl:stylesheet>

Grüße,
Thomas