2009-10-23 11 views
1

: Distinct elements and groupingAprès avoir essayé et échoué à modifier le XSL d'ici un élément Récupération et filtre par un autre

Je poste ici pour demander si quelqu'un pourrait-il aider. J'ai fondamentalement la même structure de données (la mienne est en fait un flux RSS de produits) comme dans le post précédent, mais je veux lister les éléments Description de manière unique, dans un ordre trié où l'élément File contient une valeur particulière.

je crois que le XPath pour le fichier sélectionné serait:

 
*/File[text()='file1'] 

par exemple, pour ne prendre que les éléments de fichier contenant le texte « fichier1 ».

Je n'arrive pas à trouver comment obtenir: "tous les éléments de description distincts triés, qui ont un fichier frère avec la valeur 'fichier1'".

Toute aide sera très, très appréciée!

Merci,

Matt.

+0

En fait, c'est très bien que vous avez lié à une question similaire. De cette façon, je peux vous donner une solution complète et vous avez encore quelques réflexions à faire, en l'adaptant à votre situation actuelle. ;-) – Tomalak

Répondre

1

XSLT 1.0:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <!-- index Description elements by their text value --> 
    <xsl:key name="kDescription" match="Description" use="text()" /> 

    <xsl:template match="/"> 
    <output> 
     <!-- process all Description elements... --> 
     <xsl:apply-templates select="Problems/Problem/Description"> 
     <!-- ...sorted by their own text value, ascending --> 
     <xsl:sort select="text()" /> 
     <!-- pass in the File value that we want to filter for --> 
     <xsl:with-param name="file" select="'file1'" /> 
     </xsl:apply-templates> 
    </output> 
    </xsl:template> 

    <xsl:template match="Description"> 
    <xsl:param name="file" select="''" /> 
    <!-- 
     check if the current Description node is the first in its 
     respective group, that has a File value we care for 
    --> 
    <xsl:if test=" 
     $file != '' 
     and 
     generate-id() 
     = 
     generate-id(key('kDescription', .)[../File = $file][1]) 
    "> 
     <!-- for the sake of simplicity, just make a copy here --> 
     <xsl:copy-of select="." /> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée:

<Problems> 
    <Problem> 
    <File>file1</File> 
    <Description>desc1</Description> 
    </Problem> 
    <Problem> 
    <File>file1</File> 
    <Description>desc2</Description> 
    </Problem> 
    <Problem> 
    <File>file2</File> 
    <Description>desc3</Description> 
    </Problem> 
    <Problem> 
    <File>file2</File> 
    <Description>desc1</Description> 
    </Problem> 
    <Problem> 
    <File>file1</File> 
    <Description>desc2</Description> 
    </Problem> 
</Problems>  

Je reçois:

<output> 
    <Description>desc1</Description> 
    <Description>desc2</Description> 
</output> 

Une brève explication de la part de la feuille de style qui fait le levage de charges lourdes:

$file != '' 
and 
generate-id() 
= 
generate-id(key('kDescription', .)[../File = $file][1]) 

La première partie est évidente - il est juste là pour faire en sorte qu'une chaîne de filtre $file a été adoptée en

La deuxième partie est simple regroupement Muenchian avec un petit twist.. Il compare les ID de deux nœuds, l'un en cours (generate-id()) et l'autre du groupe kDescription, filtré par la valeur $file.

kDescription index <Description> éléments par leur valeur de texte, ce qui signifie que les noeuds avec le même texte, mais un autre <File> accompagnant sera retourné par l'appel à key(). Nous devons les filtrer.

Si le nœud actuel est égal au premier nœud du groupe qui a la bonne valeur <File>, le test réussit et quelque chose est imprimé, sinon rien ne se passe.

+0

Merci beaucoup pour votre réponse rapide et utile. J'ai vraiment beaucoup à apprendre ici. La clé XSL étant quelque chose qui me défie aussi. Peut-être que vous pourriez faire la lumière ici, ainsi: http://stackoverflow.com/questions/1621507/why-dont-all-xslt-templates-get-executed-at-once Merci encore, Matt . –

+0

Salut Matt, heureux d'aider.En ce qui concerne la clé xsl: J'ai écrit quelque chose dans ma réponse ici (http://stackoverflow.com/questions/948218/xslt-3-level-grouping-on-attributes/955527#955527) qui pourrait vous aider à comprendre. Lire la partie inférieure de ma réponse, la compréhension de la question n'est pas nécessaire dans ce cas. Je vais jeter un coup d'oeil à votre autre question maintenant. – Tomalak

+0

Je vois qu'il y a déjà une réponse. Demandez si vous avez encore besoin d'explications supplémentaires. :) – Tomalak

Questions connexes