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. P>
Si l'image téléchargée est appelée 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). P>
Mais comment puis-je faire ça? P>
J'imagine si je pouvais obtenir le nom d'origine de l'image, puis diviser avant le suffixe ( 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 Peut-être que cela fonctionnerait, mais si une image appelée Y a-t-il un moyen de contourner cela? Peut-être en coupant le nom de fichier avant les 4 derniers ( .jpg code>,
.png code>,
.jpeg code>) et le code HARDCODE
_Thumbnail code> après le nom, ce serait suffisant. P>
_thumbnail code> entre les deux parties. P>
.jpg code>,
.png code>) ou 5 (
.jpeg code>) caractères? P>
6 Réponses :
Regardez le Aperçu des fonctions XPath sur W3Schools , plus particulièrement le Substring-Avant Code> Méthode. P>
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
Je crois Les fonctions XPath fonctionnant sur la chaîne pourraient vous aider. J'essaierais avec un simple remplacer code> ou
traduire code>. P>
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: 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>
éteint le dessus de ma tête: appelé comme: p> rendements: p>
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.
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 > 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>
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
Solution XSLT 2 à l'aide de RegEXP: 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. p> finalement le "_thumbnail.jpg" peut être annexé avec Concat. p> p>
Quand j'ai essayé ceci avec image.2horses.jpg code> (à partir de la question) i obtenez
image.2horses code>. (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 ')) Code> Où $ Separatorregexp =
(\. [^ \ \.] *) $ code> et $ séparateur =
_Thumbnail code>. Cela vous donnerait
image.2horses_thumbnail.jpg code> comme sortie.
Voici le remplacement sans variables: remplacer ($ nom de fichier, '(\. [^ \ \.] *) $', Concat ('_ Thumbnail', '$ 1')) code>
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.