Thorsten: Unique mit mehreren Attributen

Hallo zusammen,

ich versuche aus einer XML Datei UNIQUE Werte via XSLT auszulesen. Hier ein Beispiel:

  
<data>  
 <xmlWebControl ty="t1" st="win">a1</xmlWebControl>  
 <xmlWebControl ty="o1" st="win">b1</xmlWebControl>  
 <xmlWebControl ty="o1" st="win">c1</xmlWebControl>  
 <xmlWebControl ty="n1" st="test">d1</xmlWebControl>  
 <xmlWebControl ty="n1" st="win">e1</xmlWebControl>  
</data>

Die Ausgabe sollte hier folgendermaßen aussehen:

  
<data>  
 <xWC ty="t1" st="win">a1</xmlWebControl>  
 <xWC ty="o1" st="win">b1</xmlWebControl>  
 <xWC ty="n1" st="test">d1</xmlWebControl>  
 <xWC ty="n1" st="win">e1</xmlWebControl>  
</data>

Für die Selektion sollen nur die zwei Attribute maßgebend sein. Ich habe das Web schon hoch und runter gesucht, leider ohne Erfolg.

Eine Lösung, die bei mir leider nicht funktioniert habe ich gefunden:

  
<xsl:key name="s" match="xWC" use="concat(@ty,':',@st)"/>  
  
<xsl:for-each select="xWC[generate-id()=generate-id(key('s',concat(@ty,':',@st))[1])]">  
 <xsl:sort select="."/>  
 <xsl:value-of select="@ty"/>  
 <xsl:value-of select="@st"/>  
</xsl:for-each>  

Für einen Schubs in die richtige Richtung wäre ich dankbar.

Gruß

Thorsten

  1. Hallo,

    Stylesheet:

    <?xml version="1.0"?>  
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
      <xsl:output method="xml" indent="yes" />  
      <xsl:key name="s" match="xWC" use="concat(@ty,':',@st)"/>  
      <xsl:template match="/data">  
        <data>  
          <xsl:for-each select="xWC[generate-id()=generate-id(key('s',concat(@ty,':',@st))[1])]">  
            <xsl:sort select="."/>  
            <xsl:copy-of select="." />  
          </xsl:for-each>  
        </data>  
      </xsl:template>  
    </xsl:stylesheet>
    

    Eingabedatei:

    <?xml version="1.0"?>  
    <data>  
     <xWC ty="t1" st="win">a1</xWC>  
     <xWC ty="o1" st="win">b1</xWC>  
     <xWC ty="o1" st="win">c1</xWC>  
     <xWC ty="n1" st="test">d1</xWC>  
     <xWC ty="n1" st="win">e1</xWC>  
    </data>
    

    Wenn Du in der Schleife wie Du nur die Attribute selektierst (<xsl:value-of select="@ty"/>), dann wird nur der Textinhalt der Attribute an die Stelle kopiert. Du willst jedoch den gesamten Knoten kopieren, d.h. ein <xsl:copy-of select="."/> ist hier angebracht. Alternativ kannst Du den Ziel-xWC-Knoten natürlich auch manuell konstruieren und nur bestimmte Attribute kopieren.

    Viele Grüße,
    Christian