9
votes

Suppression des derniers caractères d'une chaîne XSLT

Dans mon CMS, il est possible de créer un nouvel article et de choisir une image à afficher sur cet article. Lorsqu'une image est choisie, une vignette de l'image sera automatiquement créée.

Si l'image téléchargée est appelée image.jpg , la vignette correspondante sera automatiquement nommée image_thumbnail.jpg . . .

J'aimerais maintenant utiliser l'image de la vignette, partout sur le site Web où l'article est mentionné, sauf dans l'article lui-même (où la grosse image d'origine doit être affichée).

Mais comment puis-je faire ça?

J'imagine si je pouvais obtenir le nom d'origine de l'image, puis diviser avant le suffixe ( .jpg , .png , .jpeg ) et le code HARDCODE _Thumbnail après le nom, ce serait suffisant.

En d'autres termes, je veux prendre le nom de fichier complet et le couper en deux parties, de sorte que je puisse insérer la chaîne _thumbnail entre les deux parties.

Peut-être que cela fonctionnerait, mais si une image appelée image.2Horses.jpg (un fichier avec plusieurs points dans le nom de fichier) est téléchargé? Une coupe naïve avant le '. ne fonctionnerait pas ici.

Y a-t-il un moyen de contourner cela? Peut-être en coupant le nom de fichier avant les 4 derniers ( .jpg , .png ) ou 5 ( .jpeg ) caractères?


0 commentaires

6 Réponses :


1
votes

Regardez le Aperçu des fonctions XPath sur W3Schools , plus particulièrement le Substring-Avant Méthode.


2 commentaires

Et s'il y a un nom de fichier avec plus qu'un point. Par exemple. Image.09.07.11.jpg, et j'ai fait une sous-chaîne-avant ('image.09.07.11.jpg', '.')? Je n'aurais pas "image" et rien de plus?


Vous pouvez obtenir le dernier point de la chaîne par récursion ou une boucle. Voir BigList.com/lists/XSL-List/archives/200102 /msg00838.html



0
votes

Je crois Les fonctions XPath fonctionnant sur la chaîne pourraient vous aider. J'essaierais avec un simple remplacer ou traduire .


0 commentaires

2
votes

Une solution générale impliquant uniquement Standard XSLT est quelque peu dure puisque vous devez rechercher la chaîne de la fin. Vous pouvez diviser votre nom de fichier USings Deux fonctions, sous-chaînes-avant-dernier et sous-chaînes-après-lafin. Malheureusement, ces fonctions ne font pas partie de XSLT. Vous pouvez utiliser Google et essayer de trouver implémentations . En supposant que ces deux fonctions sont implémentées sous forme de modèles XSLT, vous pouvez ensuite utiliser le modèle suivant pour générer des noms de vignettes: xxx pré>

Vous pouvez utiliser le modèle comme celui-ci (en supposant que la variable $ File-Name contient le nom de fichier. Nom de l'image): P>

<img>
  <xsl:attribute name="src">
    <xsl:call-template name="thumbnail-name">
      <xsl:with-param name="file-name" select="$file-name"/>
    </xsl:call-template>
  </xsl:attribute>
</img>


0 commentaires

20
votes

éteint le dessus de ma tête: xxx

appelé comme: xxx

rendements: xxx < / pré>


2 commentaires

Votre code a travaillé aussi bien Tomalak, mais je devais marquer la réponse de Chris Nielsen comme la bonne », car cela résolvait le maximum de mon problème. Si je pouvais, je marquerais le vôtre aussi correct aussi :)


+1; J'aime mieux votre solution généralisée que la mienne de toute façon.



9
votes

donné le nom de fichier de l'image en $ nom de fichier,

si vous pouvez supposer que toutes les images se termineront dans ".jpg" et n'auront pas ".jpg" ailleurs dans le nom de fichier, cela devrait alors fonctionner: p > xxx pré>

Si vous ne connaissez pas le type d'image (comme vous souhaitez également gérer le gif et le PNG également), ou si vous pensez que l'extension peut se produire plusieurs fois dans le nom de fichier (" image.jpg.jpg "), alors vous voudrez un modèle pour vous aider: P>

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image.jpg'"/>
            </xsl:call-template>
        </p>

        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image.09.07.11.jpg'"/>
            </xsl:call-template>
        </p>

        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image.gif'"/>
            </xsl:call-template>
        </p>

        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image with spaces.jpg'"/>
            </xsl:call-template>
        </p>

        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image  with  irregular    spaces.jpg'"/>
            </xsl:call-template>
        </p>

        <p>
            <xsl:call-template name="image_thumbnail">
            <xsl:with-param name="filename" select="'image.jpg.again.jpg'"/>
            </xsl:call-template>
        </p>

    </xsl:template>

    <xsl:template name="image_thumbnail">
    <xsl:param name="filename"/>
        <xsl:choose>
        <xsl:when test="contains($filename, '.')">
            <xsl:variable name="before" select="substring-before($filename, '.')"/>
            <xsl:variable name="after" select="substring-after($filename, '.')"/>
            <xsl:choose>
            <xsl:when test="contains($after, '.')">
                <xsl:variable name="recursive">
                    <xsl:call-template name="image_thumbnail">
                    <xsl:with-param name="filename" select="$after"/>
                    </xsl:call-template>
                </xsl:variable>
                <xsl:value-of select="concat($before, '.', $recursive)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat($before, '_thumbnail.', $after)"/>
            </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$filename"/>
        </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>


2 commentaires

Votre solution est à peu près égale à la mienne, je peux retourner le +1 facilement. ;-)


Désolé, -1 de moi, des hypothèses comme celle-ci conduisent au code de la buggy. Je travaille avec des outils qui font beaucoup de conversions et qu'elles ajoutent simplement la nouvelle extension à la fin, alors je pourrais facilement expérimenter quelque chose appelé image.jpg.tif.jpg



0
votes

Solution XSLT 2 à l'aide de RegEXP: xxx

réponse originale (aussi xslt 2): Cela supprime tout après le dernier séparateur (y compris le séparateur). Donc, au-dessous du séparateur $ Séparatère pourrait être '\ .jpg' ou juste '\.' ' et le séparateur $ '.jpg' ou '.' ' Dans l'autre cas. xxx

finalement le "_thumbnail.jpg" peut être annexé avec Concat.


3 commentaires

Quand j'ai essayé ceci avec image.2horses.jpg (à partir de la question) i obtenez image.2horses . (Probablement parce qu'il n'y a qu'un seul élément de la séquence, il n'y a rien à String-Join.) Une autre approche XPath 2.0 serait remplacer ($ nom de fichier, $ Separatorregexp, Concat ($ 1 ')) Où $ Separatorregexp = (\. [^ \ \.] *) $ et $ séparateur = _Thumbnail . Cela vous donnerait image.2horses_thumbnail.jpg comme sortie.


Voici le remplacement sans variables: remplacer ($ nom de fichier, '(\. [^ \ \.] *) $', Concat ('_ Thumbnail', '$ 1'))


Daniel Haley: C'est ce que j'ai voulu. Ajout du _Thumbnail.jpg est déjà trivial. Et comme ma solution implique de toute façon une regexp, votre apparence est apparemment meilleure.