Comment puis-je sélectionner les N derniers éléments avec XPath?
Je soutiens un site web qui génère du contenu XML qui est ensuite traduit dans des pages web à l'aide de XSLT. J'ai été invité à créer une nouvelle feuille de style qui va transformer la sortie de la "page" archive dans l'Atome pour la syndication. Le problème, je suis en cours d'exécution en est que la page archive contient un assez grand nombre d'éléments — 142 et comptage et l'alimentation ne doit jamais avoir plus d'une trentaine d'éléments.
Actuellement, la sortie de l'archive de la page ressemble à quelque chose comme ceci:
<archive>
<year>
<month>
<day>
<day>
...
</month>
...
</year>
...
</archive>
La year
et month
balises sont utilisées par le code HTML de transformation mais qui sont complètement hors de propos pour un flux Atom. J'avais espéré que l'utilisation de la position()
fonction avec l'axe descendant serait de travailler (//day[position()>last()-30]
), mais cela permet de sélectionner les 30 derniers jours de chaque mois, ce qui n'est pas du tout ce dont j'ai besoin. 🙂
Est-il un moyen de le faire avec XSLT ou XPath? Avoir à modifier le générateur XML pour ajouter, par exemple, un feed="true"
attribut pour les trente derniers jours semble être une très méchant bidouille.
- Donc, les jours de qui voulez-vous? les 30 premiers?
- Désolé, le dernier 30. Les entrées sont dans l'ordre chronologique, les plus récents sont à la fin.
Vous devez vous connecter pour publier un commentaire.
position()/last() renvoie la position/la dernière position dans le contexte actuel, de sorte que lorsque le navigateur est situé dans l'un <mois>, à la position() sera de retour <jour> au cours de ce mois, et la dernière() retourne le dernier <jour> au cours de ce mois, mais je suppose que vous savez que.
Donc, ce que vous pourriez faire est d'aplatir tous les <jour>'s dans un tableau et le mettre dans une variable, avant de sélectionner tout comme vous le faisiez avant.
//
raccourci. Voir ma réponse.La navigation à travers les XSLT spec aujourd'hui, j'ai trouvé une note qui explique pourquoi
//
se comporte de cette manière:En d'autres termes, lors de l'utilisation de
//
, leposition()
est calculée le long de lachild
axe, pas ladescendant-or-self
de l'axe. La spécification dedescendant
oudescendant-or-self
vous permet d'obtenir le premier/dernier n nœuds que vous attendez: