2009-07-02 5 views
3

Bitte helfen Sie mir, ich bin ein XSLT-Neuling und ich versuche, ein XML-Format in ein anderes zu transformieren.XSLT: Extrahieren eindeutiger Attributwerte

Ich muss eindeutige Attributwerte extrahieren und die Werte in ein neues Format umwandeln. Das folgende XML-Beispiel zeigt das ursprüngliche und das neue/Zielformat.

Ich habe ewig damit verbracht, dies zu tun, ohne zu genießen. Kann mir jemand helfen oder mir ein paar Hinweise geben?

Originalformat:

<base> 
    <level> 
    <level2 Name ="AA" value="1"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="2"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="3"/> 
    </level> 
    <level> 
    <level2 Name ="CC" value="4"/> 
    </level> 
    <level> 
    <level2 Name ="AA" value="5"/> 
    </level> 
</base> 

Neues Format:

<base> 
    <levelNames> 
    <level level2Name ="AA"/> 
    <level level2Name ="BB"/> 
    <level level2Name ="CC"/> 
    </levelNames> 
</base> 

Vielen Dank.

+1

Veröffentlichen Sie, was XSLT Sie bisher versucht haben, und wir werden Vorschläge machen – skaffman

Antwort

2

Noch einmal scheint die das fehlende Stück zu sein.

Ziemlich triviales Problem dafür, also lasse ich Sie Ihre eigene Arbeit machen, um sich mit Münch vertraut zu machen.

+0

Ich bin zwiespältig zwischen der Abstimmung und weitermachen und eine Lösung posten und sich schuldig fühlen. Verdammt nochmal. :-D Aber du hast wahrscheinlich recht, wenn du verdächtigst, dass dies Hausaufgaben sind, also unterlasse ich es. – Tomalak

+0

Wenn Sie es einmal getan haben, werden Sie sehen, wie einfach es wirklich ist. Sie müssen nur die Idee bekommen. Für die gängigsten XSLT-Probleme empfehle ich, zuerst hier nachzuschauen: http://www.dpawson.co.uk/xsl/sect2/sect21.html – Boldewyn

+1

mein Plan hat funktioniert! annakata

0

Bitte erstellen Sie zuerst xsl: key, dann können Sie den folgenden Code einfach verwenden.

xsl: key name = "level" match = "Level2" use = "@ Name"

<xsl:template match="/"> 
<xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="base"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:element name="levelNames"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:element> 
</xsl:template> 

    <xsl:template match="level"> 
     <xsl:for-each select="level2[count(.|key('levelName', @Name)[1]) = 1]"> 
      <xsl:sort order="ascending" data-type="text" select="@Name"/> 
      <xsl:element name="{local-name(..)}"> 
       <xsl:attribute name="level2Name"> 
        <xsl:value-of select="@Name"/> 
       </xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
    </xsl:template> 
9

XSLT Soln:

<?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" indent="yes"/> 
    <xsl:key name="LevelDistint" match="level2" use="@Name"/> 
    <xsl:template match="base"> 
     <base> 
      <levelNames> 
       <xsl:for-each select="level/level2[generate-id() = generate-id(key('LevelDistint', @Name)[1])]"> 
        <level> 
         <xsl:attribute name="level2Name"><xsl:value-of select="normalize-space(@Name)"/></xsl:attribute> 
        </level> 
       </xsl:for-each> 
      </levelNames> 
     </base> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT O/P:

<?xml version="1.0" encoding="UTF-8"?> 
<base> 
    <levelNames> 
     <level level2Name="AA"/> 
     <level level2Name="BB"/> 
     <level level2Name="CC"/> 
    </levelNames> 
</base>