2010-03-18 18 views
2

I ont un ensemble de noeudsExsl trié: ensemble de nœuds. noeud de retour par le positionner

<menuList> 
    <mode name="aasdf"/> 
    <mode name="vfssdd"/> 
    <mode name="aswer"/> 
    <mode name="ddffe"/> 
    <mode name="ffrthjhj"/> 
    <mode name="dfdf"/> 
    <mode name="vbdg"/> 
    <mode name="wewer"/> 
    <mode name="mkiiu"/> 
    <mode name="yhtyh"/> 
    and so on... 
</menuList> 

Je l'ai triée maintenant cette façon

<xsl:variable name="rtf"> 
    <xsl:for-each select="//menuList/mode"> 
     <xsl:sort data-type="text" order="ascending" select="@name"/> 
      <xsl:value-of select="@name"/> 
    </xsl:for-each> 
</xsl:variable> 

Maintenant, je dois obtenir un élément arbitraire dans le tableau trié au nombre de sa position. J'utilise le code:

<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/> 

et j'obtiens une erreur de réponse. Comment devrais-je le faire?

+0

Voir ma réponse, ce qui explique les problèmes dans votre et @ solutions de Tomalak et fournit une solution correcte. :) –

Répondre

4

Il y a au moins deux erreurs dans le code fourni:

  1. <xsl:value-of select="@name"/>

Lorsque plus d'un nœud de texte adjacent existent, ils sont combinés en un seul. Le résultat est que le RTF n'a qu'un seul (long) noeud de texte unique, et il n'y a pas de troisième noeud.

2. <xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

Cette demande du troisième noeud contenu dans exsl:node-set($rtf), mais exsl:node-set($rtf) est le nœud de document de l'arbre temporaire produit par la fonction d'extension exsl:node-set() - c'est un seul nœud. Par conséquent, l'expression XPath ci-dessus ne sélectionne rien du tout.

Une bonne solution est la suivante:

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

<xsl:template match="/"> 
    <xsl:variable name="rtf"> 
     <xsl:for-each select="//menuList/mode"> 
      <xsl:sort data-type="text" order="ascending" select="@name"/> 
       <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:value-of select="msxsl:node-set($rtf)/*[position()=3]/@name"/> 
</xsl:template> 
</xsl:stylesheet> 
+1

Merci beaucoup. J'ai joint un votre code et tout s'est avéré. Sans toi je n'aurais pas fait face. J'ai ce genre était nécessaire pour ma dernière question: "XSL: Liste divisée en colonnes.". Maintenant (avec votre aide) le code fonctionne complètement correctement (d'abord le tri, puis la partition des colonnes). Merci encore. – Kalinin

2

Vous utilisez <xsl:value-of> dans votre variable. Cela ne copie pas le nœud, mais sa valeur de chaîne (la valeur d'attribut @name du nœud). Cela signifie que vous produisez une variable contenant une chaîne concaténée, mais rien avec une structure.

Essayez:

<xsl:variable name="rtf"> 
    <xsl:for-each select="//menuList/mode"> 
    <xsl:sort select="@name" data-type="text" order="ascending" /> 
    <xsl:copy-of select="."/> 
    </xsl:for-each> 
</xsl:variable> 

Maintenant votre variable contient un fragment d'arbre résultat composé de <mode> noeuds dans votre ordre de préférence, ce qui signifie que ceci:

<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" /> 
<!-- don't forget you have element nodes now! ^^^^^^ --> 

fonctionnerait. Notez également que …/*[position() = 3] et …/*[3] sont la même chose.

+0

@Tomalak J'ai tout fait comme tu l'as dit. Mais en réponse à rien reçu. – Kalinin

+0

@Tomalak, En fait, votre solution n'est pas correcte et ne produit rien. Vous commettez erreur 2. décrit dans ma réponse. –

+0

Vous prétendez également que le 'dans le code OP ne produit rien. En fait, cela produit un noeud de texte, constitué de la valeur de chaîne de l'attribut '@ name'. –