2009-10-03 5 views
1

J'ai déjà créé mon XSLT mais j'aimerais pouvoir trier les données, ajouter aussi une sorte d'index pour pouvoir regrouper les éléments, la difficulté que j'ai est le noeud que je veux trier par contient plusieurs valeurs - les valeurs id aiment trier par.XSLT - Tri de plusieurs valeurs

Par exemple, voici mon XML:

<item> 
<title>Item 1</title> 
<subjects>English,Maths,Science,</subjects> 
<description>Blah Blah Bah...</description> 
</item> 
<item> 
<title>Item 2</title> 
<subjects>Geography,Physical Education</subjects> 
<description>Blah Blah Bah...</description> 
</item> 
<item> 
<title>Item 3</title> 
<subjects>History, Technology</subjects> 
<description>Blah Blah Bah...</description> 
</item> 
<item> 
<title>Item 4</title> 
<subjects>Maths</subjects> 
<description>Blah Blah Bah...</description> 
</item> 

Donc, si je sorte par <subjects> je reçois cet ordre:

English,Maths,Science, 
Geography,Physical Education 
History, Technology 
Maths 

Mais je voudrais ce genre de sortie:

English 
Geography 
History 
Maths 
Maths 
Physical Education 
Science 
Technology 

Sortie du XML pour chaque sujet contenu dans <subjects>, donc Item1 contient des ts Maths, Anglais & Science donc je veux sortir ce titre et la description 3 fois parce que c'est pertinent pour tous les 3 sujets.

Quel est le meilleur moyen de faire cela avec XSLT?

+0

XSLT 1.0 ou 2.0? –

+0

Ceci est XSLT 1.0 – CLiown

Répondre

1

Je pense qu'un moyen de le faire serait d'utiliser la fonction d'extension de poste pour effectuer un traitement en plusieurs passes. Premièrement, vous parcourez les nœuds sujets existants, en les séparant par des virgules, pour créer un nouvel ensemble de nœuds d'éléments; un par sujet.

Ensuite, vous parcourez ce nouveau nœud dans l'ordre des sujets.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="exsl" version="1.0"> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:variable name="newitems"> 
     <xsl:for-each select="items/item"> 
      <xsl:call-template name="splititems"> 
       <xsl:with-param name="itemtext" select="subjects"/> 
      </xsl:call-template> 
     </xsl:for-each> 
     </xsl:variable> 
     <xsl:for-each select="exsl:node-set($newitems)/item"> 
     <xsl:sort select="text()"/> 
     <xsl:value-of select="text()"/> 
     <xsl:text> </xsl:text> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="splititems"> 
     <xsl:param name="itemtext"/> 
     <xsl:choose> 
     <xsl:when test="contains($itemtext, ',')"> 
      <item> 
       <xsl:value-of select="substring-before($itemtext, ',')"/> 
      </item> 
      <xsl:call-template name="splititems"> 
       <xsl:with-param name="itemtext" select="substring-after($itemtext, ',')"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:when test="string-length($itemtext) &gt; 0"> 
      <item> 
       <xsl:value-of select="$itemtext"/> 
      </item> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

Notez que l'exemple ci-dessus utilise les fonctions d'extension de Microsoft. Selon le processeur XSLT que vous utilisez, vous devrez peut-être spécifier un autre espace de noms pour le processeur.

Vous devrez peut-être également faire un «découpage» des sujets, car dans votre exemple XML ci-dessus, il y a un espace avant l'un des sujets (Technologie) dans la liste délimitée par des virgules.

1

Eh bien, le traitement du contenu des nœuds de texte n'est pas vraiment le mandat de XSLT. Si vous le pouvez, vous devriez probablement changer la représentation pour ajouter plus de structure XML dans les éléments sujets. Sinon, vous devrez écrire un code de traitement de chaîne très intelligent en utilisant les fonctions de chaîne XPath, ou peut-être utiliser un processeur XSLT basé sur Java et transférer le traitement de chaîne à une méthode Java. Ce n'est pas simple.

Questions connexes