L'obtention d'une sous-chaîne APRÈS la dernière occurrence d'un caractère dans XSLT
J'ai une chaîne de caractères dans un fichier XML qui ressemble à ceci:
M:Namespace.Class.Method(quelque Chose d'un, quelque Chose b)
Le nombre de point (.) des personnages est abritrary, le sens qu'il peut être seulement 2 comme dans cet exemple, mais il peut être plus.
Je voudrais utiliser XSLT pour obtenir une sous-chaîne de la chaîne à partir du dernier caractère'.', de sorte que je ne sera laissé avec:
Méthode(quelque Chose d'un, quelque Chose b)
Je ne pouvais pas faire cela à l'aide de la norme sous-chaîne/chaîne-après les fonctions.
Est-il un moyen facile de faire cela?
OriginalL'auteur lysergic-acid | 2012-01-31
Vous devez vous connecter pour publier un commentaire.
En XSLT 1.0, vous aurez besoin d'utiliser un modèle récursif, comme ceci:
et à l'appeler comme ceci:
Dans XSLT 2.0, vous pouvez utiliser le marquer() fonction et il suffit de sélectionner le dernier élément de la séquence:
Malheureusement .NET ne prend pas en charge XSLT 2.0 en mode natif. Sauf si vous avez Saxon.net, XQSharp, ou d'autres moteurs 2.0, vous aurez besoin d'utiliser un 1.0 solution.
Cela a fait le tour, merci!
OriginalL'auteur Mads Hansen
Ici est une solution plus efficace O(N) par rapport à O(N^2) pour la accepté de répondre à:
Lorsque cette transformation est appliquée sur le document XML suivant:
le voulait, résultat correct est produit:
Explication:
Cette solution ne contient pas d'appel à la
substring-after()
fonction. Au lieu de cela, à chaque étape, le seul caractère de la chaîne est comparée pour l'égalité avec le caractère de point. Parce qu'il y a au plus N caractères, c'est O(N) -- linéaire de la complexité.Au contraire, la accepté de répondre aux appels de la
substring-after()
fonction sur chaque étape. Dans le pire des cas, il pourrait être N points, et donc ce serait O(N^N) -- complexité quadratique.Note: Nous faisons l'hypothèse raisonnable que dans les deux solutions de localisation de la k-ième caractère de la chaîne est O(1).
contains()
va regarder à travers des personnages principaux jusqu'à ce qu'il trouve un point. Après il trouve un point, chaque personnage, il a regardé si la mesure est supprimée. Donc, il va chercher à chaque caractère au plus une fois.Je me réfère à
<xsl:with-param name="string" select="substring-after($string, $delimiter)"/>
. Si il y am
points dans la chaîne de caractères et la longueur de la chaîne estn
, alors cet algorithme estO(m*n)
À droite, vous avez raison. Je ne considère pas que
substring-after
aurez à regarder à travers l'ensemble de l' (restant) de la chaîne.Mon explication était fausse (mentionné
contains()
au lieu desubstring-after()
). Fixe maintenant.OriginalL'auteur Dimitre Novatchev
Si vous ne savez pas que vous avez exactement deux points dans vos cordes, alors vous pouvez essayer:
OriginalL'auteur Igor Korkhov