2009-07-02 6 views
3

S'il vous plaît, aidez, je suis un débutant XSLT et j'essaye de transformer un format XML en un autre.XSLT: extraire des valeurs d'attribut uniques

J'ai besoin d'extraire des valeurs d'attribut uniques et de transformer les valeurs dans un nouveau format. L'exemple XML ci-dessous montre le format original et nouveau/cible. J'ai passé des siècles à essayer de le faire sans aucun plaisir. Quelqu'un peut-il aider ou me donner des indications?

Format original:

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

Nouveau format:

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

Merci beaucoup.

+1

Postez ce que XSLT vous avez essayé jusqu'à présent, et nous ferons des suggestions – skaffman

Répondre

2

Encore une fois le Muenchian grouping technique semble être la pièce manquante.

Un problème assez trivial pour cela, alors je vais vous laisser faire votre propre travail pour se familiariser avec Muench.

+0

Je suis ambivalent entre voter en place et passer à autre chose et poster une solution et se sentir coupable à ce sujet. Allez au diable. :-D Mais vous avez probablement raison de penser que c'est un devoir, alors je m'abstiens. – Tomalak

+0

Si vous l'avez déjà fait, vous verrez à quel point c'est facile. Vous devez juste avoir l'idée. Pour la plupart des problèmes XSLT courants, je recommande vraiment d'abord jeter un oeil ici: http://www.dpawson.co.uk/xsl/sect2/sect21.html – Boldewyn

+1

mon plan a fonctionné! annakata

0

S'il vous plaît créer d'abord xsl: key puis vous pouvez utiliser le code ci-dessous facilement.

xsl: nom de clé = correspondance "levelName" = utilisation "de niveau 2" = "@ Nom"

<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> 
Questions connexes