xsl:for-each selbe Inhalte weglassen

RE-DIK

Mitglied
Hallo zusammmen,

weiß jemand wie ich meine for-each ändern kann damit ich in meine Ausgabe nicht mehr doppelt ist.

Momentan weiß ich nicht was ich in meiner xsl einsetzen kann damit es nur einmal anzeigt.

meine Ausgabe sieht so aus:

Gruppe = a Nummer = 1
Gruppe = a Nummer = 1
Gruppe = c Nummer = 1
Gruppe = c Nummer = 1

xml

<root>
<bereich>
<gruppe nummer="1">a</gruppe>
<eigenschaft>CMA</eigenschaft>
</bereich>
<bereich>
<gruppe nummer="1">a</gruppe>
<eigenschaft>DGD</eigenschaft>
</bereich>
<bereich>
<gruppe nummer="2">b</gruppe>
<eigenschaft>TAT</eigenschaft>
</bereich>
<bereich>
<gruppe nummer="2">b</gruppe>
<eigenschaft>AG</eigenschaft>
</bereich>
<bereich>
<gruppe nummer="1">c</gruppe>
<eigenschaft>GG</eigenschaft>
</bereich>
<bereich>
<gruppe nummer="1">c</gruppe>
<eigenschaft>HF</eigenschaft>
</bereich>
</root>

Meine xsl:for-each

<xsl:for-each select="root/bereich/gruppe[@nummer='1']">
Mein CODE
</xsl:for-each>

Hoffe jemand kann mir helfen
 
... weiß jemand wie ich meine for-each ändern kann damit ich in meine Ausgabe nicht mehr doppelt ist.
Momentan weiß ich nicht was ich in meiner xsl einsetzen kann damit es nur einmal anzeigt...
Mir ist momentan nicht ganz klar, wie dein Transformationsergebnis überhaupt aussehen soll.
 
Mein Ergebnis soll einfach die Ausgabe von alle Elementen mit dem Attribut 1 sein aber es soll nur einmal mit der gleichen Gruppe auftauchen.

meine Code den ich geschrieben hab erstellt momentan es so:

<root>
<ausgabe>
<gruppe>a</gruppe>
<nummer>1</nummer>
</ausgabe>
<ausgabe>
<gruppe>a</gruppe>
<nummer>1</nummer>
</ausgabe>
<ausgabe>
<gruppe>c</gruppe>
<nummer>1</nummer>
</ausgabe>
<ausgabe>
<gruppe>c</gruppe>
<nummer>1</nummer>
</ausgabe>
</root>

ich möchte mit meiner XSL jede Gruppe nur einmal mit der Nummer ausgeben.

also so:


<root>
<ausgabe>
<gruppe>a</gruppe>
<nummer>1</nummer>
</ausgabe>
<ausgabe>
<gruppe>c</gruppe>
<nummer>1</nummer>
</ausgabe>
</root>

Ich suche also irgendeine Bedingung oder Funktion die soetwas kann.
 
Hallo,
offensichtlich willst du eine Gruppierung vornehmen.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

  <xsl:key name="gruppe" match="bereich" use="concat(gruppe/@nummer,gruppe)"/>

  <xsl:template match="/root">
    <root>
      <xsl:for-each select="bereich[count(.|key('gruppe',concat(gruppe/@nummer,gruppe))[1])=1][gruppe/@nummer=1]">
        <xsl:sort select="concat(gruppe/@nummer,gruppe)"/>
        <ausgabe>
          <gruppe><xsl:value-of select="gruppe"/></gruppe>
          <nummer><xsl:value-of select="gruppe/@nummer"/></nummer>
        </ausgabe>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>
Wenn du obiges Stylesheet auf dein XML loslässt, dann ergibt sich bei mir folgender Output, wobei das blau markierte Prädikat die Ausgabe lediglich auf die Gruppennummer 1 beschränkt.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <ausgabe>
    <gruppe>a</gruppe>
    <nummer>1</nummer>
  </ausgabe>
  <ausgabe>
    <gruppe>c</gruppe>
    <nummer>1</nummer>
  </ausgabe>
</root>
 
ja genau das meine ich.

ich würde aber dies in der Mitte noch gerne verstehen. Könntest du es mir erklären was count, key und concat machen.

<xsl:for-each select="bereich [count(.|key('gruppe',concat(gruppe/@nummer,gruppe))[1])=1] [gruppe/@nummer=1]">

Danke dir für deine Hilfe
 
Sieh dir bitte mal dieses Tutorial an: Gruppieren mit der Muench'schen Methode. Hier wird das gut beschrieben, besser könnte ich es auch nicht. ;)

Ich habe mit der concat-Funktion die Gruppennummer und den Gruppenwert zusammengeführt und so im Schlüssel zusammen verarbeitet, da ich vermute, dass diese Werte irgendwie zusammengehören.
Vielleicht wird das deutlicher, wenn man die Gruppen mit einem solchen Attribut versieht und die eigenschaft-Elemente in die Gruppen einfügt:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

  <xsl:key name="gruppe" match="bereich" use="concat(gruppe/@nummer,gruppe)"/>

  <xsl:template match="/root">
    <root>
      <xsl:for-each select="bereich[count(.|key('gruppe',concat(gruppe/@nummer,gruppe))[1])=1]">
        <xsl:sort select="concat(gruppe/@nummer,gruppe)"/>
          <gruppe kategorie="{concat(gruppe/@nummer,gruppe)}">
            <xsl:for-each select="key('gruppe',concat(gruppe/@nummer,gruppe))">
              <xsl:copy-of select="eigenschaft"/>
            </xsl:for-each>
          </gruppe>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>
 
hat auch jemand eine Lösung für größere Datenmengen? Mit der Gruppierung dauert es sehr lange.

Es würde auch gehen wenn die XSL den aktuellen Datensatz mit dem voherigen vergleich und wenn die gleich sind einfach überspringen.

Wenn es möglich ist würde ich sehr dankbar sein. Mit meinen Wissen bekomme ich das nicht hin aber ich würde es gerne lernen.
 
... Es würde auch gehen wenn die XSL den aktuellen Datensatz mit dem voherigen vergleich und wenn die gleich sind einfach überspringen...
... genau das bewirkt das Prädikat in dieser for-each-Schleife:
Code:
<xsl:for-each select="bereich[count(.|key('gruppe',concat(gruppe/@nummer,gruppe))[1])=1]">
...
</xsl:for-each>
 
Zurück