2010-08-09 6 views
0

J'ai un fichier XML dont le contenu que je veux trier par ordre du document (essentiellement dans l'ordre que les articles ont été écrits sur).Trier par position XSL() donnant des résultats étranges

J'utilise actuellement le code suivant:

<xsl:template match="/Error"> 
     <xsl:apply-templates> 
      <xsl:sort select="position()" order="descending" /> 
     </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="/Error/Warning"> 
<!-- etc --> 
</xsl:template> 

XML Exemple (données remplacé pour faciliter la lecture):

<Error> 
<Warning data="stuff" timestamp="08:26:17 2010/08/01">CODE.1</Warning> 
<Clear data="stuff" timestamp="08:26:36 2010/08/01">CODE.2</Clear> 
<Warning data="stuff" timestamp="08:36:00 2010/08/01">CODE.3</Warning> 
<Clear data="stuff" timestamp="08:36:56 2010/08/01">CODE.4</Clear> 
<Warning data="stuff" timestamp="08:40:31 2010/08/01">CODE.5</Warning> 
</Error> 

Ceci, cependant, semble donner des résultats étranges comme il semble être dans aucun ordre particulier! Des idées?

Retrait du genre semble faire fonctionner correctement - cet ordre sera fiable en écriture ordre ou est-ce pas garanti?

+0

Vous ne fournissez pas la sortie problématique et vous n'expliquez pas ce qui est mal à la sortie que vous ne l'avez pas montré. De plus, vous ne spécifiez pas ce qui doit vraiment être trié. Cette question est incomplète et indéfinie. S'il vous plaît, corrigez votre question. –

+0

Il semble que votre modèle soit erroné, il devrait être 'ErrorLog/Warning'. Aussi, vous trier dans l'ordre des documents, donc ce n'est pas nécessaire. –

+0

@Dimitre La sortie est juste dans un ordre aléatoire, je n'ai pas jugé important de montrer cela? - Question mise à jour afin qu'elle soit plus claire @Alejandro Je veux tout commander dans ''. La réponse de Paul Butchers ci-dessous fonctionne bien pour ce dont j'ai besoin. – Chris

Répondre

1

<xsl:apply-templates /> fonctionne sur le nodeset sélectionné dans l'ordre du document, supprimer l'élément de tri, et cela fonctionnera comme vous le souhaitez. Voir: Applying Template Rules

1

arent vous manque ce que les nœuds que vous souhaitez appliquer un modèle à?

par exemple:

<xsl:apply-templates select="/Error/messages" /> 

serait agréable d'avoir le xml que vous travaillez avec en traitant avec un problème de xslt.

+0

Mise à jour avec un peu plus d'infos ... – Chris

1

devrait-il pas être comme ça? utilisant l'attribut select sur apply-templates?

<xsl:template match="/Error"> 
    <xsl:apply-templates select="./Warning" /> 
</xsl:template> 

<xsl:template match="/Error/Warning"> 
    <!-- etc --> 
</xsl:template> 

Vous devez obtenir la sortie dans l'ordre dans lequel elle se trouve dans la source XML.

+0

@Chris Si vous voulez filtrer les enfants de Error, et seulement avoir des éléments d'avertissement, il vaut mieux utiliser 'xsl: apply-templates/@ select', comme défini dans cette réponse , que de simplement utiliser 'xsl: template/@ match' –

Questions connexes