Anfänger: doppelte Einträge ignorieren

Hallo zusammen, ich habe eine Trefferliste in der Form:

<XX_Nachweis>
ibxx:Person\_zusatzangaben
ibxx:kennzeichen16123400100066______</ibxx:kennzeichen>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeHerr</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameDieter</ibxx:vorname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeFrau</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameJutta</ibxx:vorname>
ibxx:geburtsnameMaier</ibxx:geburtsname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeHerr</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameDieter</ibxx:vorname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeFrau</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameJutta</ibxx:vorname>
ibxx:geburtsnameMaier</ibxx:geburtsname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeFrau</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameCarmen</ibxx:vorname>
ibxx:geburtsnameWeiß</ibxx:geburtsname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeHerr</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameDieter</ibxx:vorname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
ibxx:Interessent
ibxx:XX\_Person
ibxx:anredeFrau</ibxx:anrede>
ibxx:nachnameOderFirmaMustermann</ibxx:nachnameOderFirma>
ibxx:vornameJutta</ibxx:vorname>
ibxx:geburtsnameMaier</ibxx:geburtsname>
ibxx:strasseMusterplatz</ibxx:strasse>
ibxx:hausnummer5</ibxx:hausnummer>
ibxx:postleitzahlPostzustellung77777</ibxx:postleitzahlPostzustellung>
ibxx:ort\_PostMusterhausen</ibxx:ort_Post>
ibxx:bestimmungslandD</ibxx:bestimmungsland>
</ibxx:XX_Person>
</ibxx:Interessent>
    </ibxx:Person_zusatzangaben>
 </XX_Nachweis>

(Auch wenn es nicht so scheint, die Trefferliste ist richtig, sinnvoll und nicht zu korrigieren).

Jetzt muss ich für diese Interessenten eine Aktion durchführen, allerdings für jeden nur einmal. Dazu habe ich die Liste sortiert und danach abgefragt, ob der unmittelbare Vorgänger im Namen und Vornamen gleich ist.

<xsl:variable name="zusatzangaben" select="/xx:XX_Nachweis/xx:Person_zusatzangaben/xx:Interessent[xx:kennzeichen = $id]" />
 <xsl:for-each select="$zusatzangaben/xx:Interessent/xx:XX_Person">
<xsl:sort select="xx:nachnameOderFirma"/>
<xsl:sort select="xx:vorname"/>

	<xsl:if test="not(preceding::xx:XX\_Person[1]/xx:nachnameOderFirma = ./xx:nachnameOderFirma and preceding::xx:XX\_Person[1]/xx:vorname = ./xx:vorname)">  

<tue etwas>

Es wird dann richtig sortiert (Carmen, Dieter, Dieter, Dieter, Jutta, Jutta, Jutta), die Prüfung greift aber wieder auf die ursprüngliche Reihenfolge zurück, so dass der Vorgänger von Carmen Jutta ist usw.

Was läuft falsch, wer kann helfen - schon mal vielen Dank im Voraus, dass Ihr Euch mit der Frage beschäftigt!

  1. Hallo,

    hab ich das richtig verstanden, dass du gruppieren willst? Dann schau die mal diese Methode an. Oder bei Selfhtml.

    Viele Grüße
    Siri

    1. Hallo *,

      hab ich das richtig verstanden, dass du gruppieren willst? Dann schau die mal diese Methode an. Oder bei Selfhtml.

      Falls XSLT 2.0 eingesetzt wird, dann ist xsl:for-each-group das Mittel der Wahl.

      Grüße,
      Thomas

      1. Hallo Thomas,

        Dies ist die Info aus meiner Kopfzeile:
        <xsl:stylesheet version="2.0">

        Dann sollte es xslt 2.0 sein, oder?

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

        Gruß Frank

        1. 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

          1. super, Thomas, vielen Dank! Ein (großes) Problem gelöst!

            Gruß Frank

    2. Hallo Thomas, hallo Siri, nein gruppieren will ich nicht (jedenfalls nicht bewusst. Ich möchte an die Adresse einen Brief versenden (keine Werbung, nichts illegales, alles rechtens :-)) und damit Papier gespart wird halt nur einmal. Die Briefe kommen sortiert raus, aber leider 3x für Dieter und 3x für Jutta. Den Link mit der Gruppierung hab ich verfolgt, aber konnte nichts konkretes für mein Problem entdecken

      Grüße Frank

      1. Hallo Frank,

        Den Link mit der Gruppierung hab ich verfolgt, aber konnte nichts konkretes für mein Problem entdecken

        Gruppieren und dann den ersten Eintrag der jeweiligen Personengruppe wählen, sollte helfen.

        Nochmal meine Frage: Wird XSLT 2.0 verwendet?

        Grüße,
        Thomas

        1. Hallo Thomas, welcher Eintrag der Kopfzeile enthält die Info?

          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="2.0"

          Ich führe die Transformation innerhalb eines Programmes aus, dieses erzeugt keine Fehlermeldungen etc. (Black Box)

          Gruß Frank

          1. @@Anfänger:

            nuqneH

            Hallo Thomas, welcher Eintrag der Kopfzeile enthält die Info?
            <?xml version="1.0" encoding="UTF-8"?>
            <xsl:stylesheet version="2.0"

            Wenn einer, dann der zweite.*

            Allerdings kann dort vielleicht auch stehen was will, die Frage ist: Welchen XSLT-Prozessor verwendest du? Kann der XSLT 2?

            Qapla'

            * Der erste Eintrag bezieht sich auf die XML-Version des Dokuments. Wenn man nicht Element- und Attributbezeichner mit Nicht-ASCII-Zeichen verwendet, sollte das in den allermeisten Fällen 1.0 sein.

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Hallo Gunnar

              Allerdings kann dort vielleicht auch stehen was will, die Frage ist: Welchen XSLT-Prozessor verwendest du? Kann der XSLT 2?

              Auch wenn es schwer zu glauben ist: ich weiss nicht welchen XSLT Prozessor eingesetzt wird. Die Transformation wird von einem Programm aufgerufen, ich bekomme keine Fehlermeldung oder sonstigen Hinweise - entweder es kommt ein Dokument (in meinem Fall PDF raus oder nicht. Wenn nicht dann hab ich einen Fehler gemacht und muss suchen. Aber: Da ich ja ausdrücklich nicht gruppieren will: spielt die xslt Version wirklich eine Rolle?

              Gruß Frank

    3. Hallo Siri, jetzt habe ich das mit dem Gruppieren verstanden - man sollte halt genauer lesen. Das bei mir in der Liste jeweils "Mustermann" auftaucht ist Zufall, dass könnte auch Dieter Maier, Jutta Müller und Carmen Schulze sein. Also mit dem Gruppieren hat es nichts zu tun.

      Gruß Frank

  2. Hi,

    Jetzt muss ich für diese Interessenten eine Aktion durchführen, allerdings für jeden nur einmal. Dazu habe ich die Liste sortiert und danach abgefragt, ob der unmittelbare Vorgänger im Namen und Vornamen gleich ist.

    Namensgleichheit bedeutet aber nicht, daß es identische Personen sind.

    Alleine hier in der Stadt gibt es 16 Telephonbucheinträge für "Peter Müller" (ohne die "Peter Müller-Doppelnamen mitzuzählen). Keine Ahnung, wieviele Tausend "Peter Müller" es bundesweit gibt.

    Ich kenne auch Fälle, wo es nicht um Allerweltsnamen geht, bei denen 2 Personen unter der gleichen Adresse mit gleichem Namen leben - oftmals Vater und Sohn, aber auch ohne daß ein Verwandschaftsverhältnis existiert.

    Insofern wäre etwas eindeutiges wie eine Kundennummer deutlich besser geeignet als der Kundenname, um zu entscheiden, wer einen Brief bekommt.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo Andreas, Du hast vollkommen recht, die Namensgleichheit ist ein zu geringes Identifizierungsmerkmal, ich nehme noch die gesamte Adresse hinzu- wenn ich dies hier angegeben hätte wäre der Code einfach zu lang geworden. Für diesen speziellen Fall reichte der Vor- und Zuname aus. Interessanterweise hatten wir heute morgen eine ganz ähnliche Diskussion: Normalerweise haben wir noch das Geburtsdatum als Kriterium, aber es gibt auch eine ganze Reihe Gerd Müllers die am gleichen Tag geboren sind, so dass in ganz bestimmten Einzelfällen (0,001%) ein Schreiben den Falschen Empfänger erreicht. Natürlich wird nach dem Gesetz der größten Sauerei genau dieser Fall hier eintreten... Die Folgen sind aber verschmerzbar.

      Gruß Frank