ThomasM: doppelte Einträge ignorieren

Beitrag lesen

Hallo Frank,

Dann sollte es xslt 2.0 sein, oder?

Ja, sofern ein Prozessor wie Saxon (ab HE) zum Einsatz kommt.

Die Transformation läuft mit xsl:for-each-group aber auf Fehler.

Hier ein Testbeispiel (habe einen Namespace für ibxx eingetragen, welcher auch im XML des Ausgangspostings vorkommen muss). Dieses gruppiert nach der vorname-/nachnameOderFirma-Kombination und sofern diese eindeutig ist, wird die erste sortierte Gruppierung weiterverwendet:

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="2.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  xmlns:fn="http://www.w3.org/2005/xpath-functions"  
  xmlns:ibxx="http://example.com/ibxx"  
  exclude-result-prefixes="#all">  
  
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
  
  <xsl:template match="XX_Nachweis">  
  
    <test_output>  
      <xsl:for-each-group select="ibxx:Person_zusatzangaben/ibxx:Interessent/ibxx:XX_Person"  
        group-by="fn:concat(ibxx:vorname, ' ', ibxx:nachnameOderFirma)">  
  
        <xsl:sort select="fn:concat(ibxx:vorname, ' ', ibxx:nachnameOderFirma)" order="ascending" data-type="text"/>  
  
        <xsl:for-each select="current-group()">  
          <xsl:if test="position() = 1">  
            <out>  
              <vorname><xsl:value-of select="ibxx:vorname"/></vorname>  
              <nachnameOderFirma><xsl:value-of select="ibxx:nachnameOderFirma"/></nachnameOderFirma>  
              <strasse><xsl:value-of select="ibxx:strasse"/></strasse>  
              <!-- usw. -->  
            </out>  
          </xsl:if>  
        </xsl:for-each>  
      </xsl:for-each-group>  
    </test_output>  
  
  </xsl:template>  
  
</xsl:stylesheet>

Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>  
<test_output>  
  <out>  
    <vorname>Carmen</vorname>  
    <nachnameOderFirma>Mustermann</nachnameOderFirma>  
    <strasse>Musterplatz</strasse>  
  </out>  
  <out>  
    <vorname>Dieter</vorname>  
    <nachnameOderFirma>Mustermann</nachnameOderFirma>  
    <strasse>Musterplatz</strasse>  
  </out>  
  <out>  
    <vorname>Jutta</vorname>  
    <nachnameOderFirma>Mustermann</nachnameOderFirma>  
    <strasse>Musterplatz</strasse>  
  </out>  
</test_output>

Den Gruppenschlüssel kann man sich übrigens mit current-grouping-key() ausgeben lassen oder diesen für weitere Abfragen verwenden.

Grüße,
Thomas