Tri avec XSLT

Mise à JOUR - Nouveau code au bas

Je suis à essayer de comprendre comment utiliser la fonction de tri à tirer de l'enregistrement le plus récent à partir de certaines données XML. Je suis très nouveau à l'aide de XSLT et suis en cours d'exécution dans un tas de problèmes. Voici un exemple de mes données...

<content date="1/13/2011 1:21:00 PM">
    <collection vo="promotion">
        <data vo="promotion" promotionid="64526" code="101P031" startdate="1/7/2011 12:00:00 AM"/>
        <data vo="promotion" promotionid="64646" code="101P046" startdate="1/9/2011 12:00:00 AM"/>
    </collection>
</content>

Ce que je veux faire est de trier les données par promotionid dans decsending commande et UNIQUEMENT en sortie via HTML le promotionid qui est le plus grand. Ici est le long des lignes de ce que j'essayais

Mise à JOUR - C'est la dernière version du code qui est toujours confronté à des problèmes.

<html><body>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/data">
        <xsl:apply-templates>
            <xsl:sort select="promotionid" order="descending" data-type="number" />
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="content/collection">
        <xsl:value-of select="data/@promotionid" />
    </xsl:template> 
</xsl:stylesheet>
</body></html>

Bien que ce ne retournent les résultats que j'obtiens en retour est "64526" et non PAS "64646'.

Peut aider quelqu'un? Aussi j'ai vu des exemples en ligne où vous pouvez les trier en fonction de plusieurs champs. Il peut être intéressant de noter maintenant, plutôt que de demander plus tard, que l'on peut envie de finir le tri par date de début plutôt que de promotionid. J'ai réussi à venir avec un code pour briser la date AAAA, MM, JJ, mais n'ont aucune idée de comment je pourrais même commencer à utiliser qu'en dehors de l'aide de ceux que mon sélectionnez paramater de la sorte, mais je ne sais pas si ça fonctionne réellement ou pas.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Merci d'avance et je m'excuse auprès de mes moins de novice XSLT compétences.

------------------------------------------------------

Après un peu d'aide ici, le code a changé, mais ne fonctionne toujours pas comme prévu. Voici le code...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Et je suis toujours de voir le moindre de la valeur de sortie plutôt que de la plus grande. Peut-être il ya une autre façon de faire cela avec le tri? Comme je suis ouvert à cette possibilité.

1/14/11 10:37 mise à Jour
*-------------------------------------------------------------------*
D'accord à l'aide de ce code maintenant, en effet, de trier les données et de sortie de la plus haute promotionid nombre. Merci une Tonne!

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="collection">
      <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="data">
         <xsl:sort select="@promotionid" data-type="number" order="descending"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
<xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Ignorant la promtionid maintenant, pouvez-vous me montrer comment je sorte, à la descente, par la date? J'ai essayé de l'enlever, Malheureusement, je sais que les dates devraient avoir une statique de la longueur, mais nous n'avons aucun contrôle sur les données que nous recevons 🙁

Peut également vous recommander un livre pour commencer à vraiment certains de mieux comprendre de tout cela? Vous avez été d'une grande aide!

Bonne question, +1. Voir ma réponse pour la cause de votre problème et pour l'exemple de tri sur plusieurs kes, aussi bien pour une recommandation abot le format de date que vous utilisez.

OriginalL'auteur dscl | 2011-01-13