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!
OriginalL'auteur dscl | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Il y a une erreur évidente ici:
promotionid
est un attribut, pas un élément.Solution:
Une autre erreur:
La
<xsl:apply-templates>
et le tri est effectué trop tard.Vous voulez:
et
Comme pour votre élargi question:
Cette transformation:
lorsqu'il est appliqué au document XML fourni par le:
produit le résultat voulu:
Toutefois, notez que ce bien ne pas traiter la variable longueur de la date de composants. Il vaut mieux utiliser le format de longueur fixe: mm/jj/aaaa
Oui, il y a aussi d'autres erreurs dans votre code -- voir ma mise à jour de réponse.
Bonjour encore une fois, j'ai essayé la mise à jour que vous avez énumérés ci-dessus et vois toujours le mauvais résultat. J'ai téléchargé le code ici snipplr.com/view/47119/sort Remarque, j'ai essayé de le sélectionner avec le @ et sans depuis votre message d'origine a dit qu'il était en manque, mais la mise à jour n'inclut également pas.
Oui, j'avais juste copié/collé votre code, il se reflète maintenant. Comme pour l'incapacité toujours à obtenir le résultat souhaité, vous pouvez avoir encore d'autres problèmes. Pourquoi ne pas vous modifiez votre question avec le dernier code, de sorte que je vais être en mesure d'essayer et de reproduire votre problème?
J'ai mis à jour mon premier post avec le code actuel, en bas, par votre suggestion, parce que je suis toujours pas à voir la valeur correcte.
OriginalL'auteur Dimitre Novatchev