8
votes

XSLT: Trouver la dernière occurrence dans une chaîne

donné un numéro de formulaire comme: xxx

Je veux vous retrouver avec: xxx

donc j'ai besoin de trouver la position de Le deuxième soussecore

Notez qu'il n'y a pas de motif ou de longueur standard à l'une des "sections" entre les souligneurs (donc je ne peux donc pas utiliser la sous-chaîne pour éliminer simplement la dernière section).

Les solutions XPath 2.0 vont bien.


2 commentaires

Que s'est-il passé avec le premier soulignement de votre échantillon?


Bonne question (+1). Consultez ma réponse pour les solutions XPath 2.0 et XSLT 1.0 au problème plus général lorsque le nombre de souligneurs n'est pas connu à l'avance. :)


4 Réponses :


3
votes
string-join(tokenize($s, '_')[position() <= 2], '')

0 commentaires

14
votes

@pavel_minaev a fourni des solutions XPath 1.0 AMD XPATH 2.0 qui fonctionnent s'il est connu à l'avance que le nombre de soulignements est 2.

Voici des solutions pour le problème plus difficile, où le nombre de nonDRSCORES ISN 'T statiquement connu (peut être n'importe quel nombre):

xpath 2.0 : xxx

Xslt 1.0 : xxx

Lorsque cette transformation est appliquée à n'importe quel document XML (non utilisé), le résultat correct souhaité est produit : xxx


0 commentaires

6
votes

solution plus facile dans XSLT 2.0:

codepoints-to-string(reverse(string-to-codepoints(
    substring-before(
        codepoints-to-string(reverse(string-to-codepoints($s))), '_'))))


0 commentaires

0
votes

Une idée généralisée - xxx

est d'obtenir l'index de la dernière occurrence en divisant la chaîne.

index de dernière occurrence = longueur de chaîne ($ string) - Longueur de la dernière chaîne après la division


1 commentaires

Une solution dépend d'une fonction d'extension que seuls quelques processeurs soutiennent à peine une "généralisée".