删除最后一个字符在XSLT字符串(Removing the last characters in a

2019-06-25 18:44发布

在我的CMS就可以创建一个新的文章,并选择在图像上那篇文章中显示。 当选择图像时,图像的缩略图将被自动创建。

如果上传的图像称为image.jpg的 ,那么相应的缩略图会自动将其命名image_thumbnail.jpg。

我现在想用缩略图,在文章中提到的网站上到处都是,除了文章本身(在原始大图应显示)英寸

但是,我怎么能做到这一点?

我想如果我能得到的图像的原始名称,然后后缀(前分裂它.jpg.png.jpeg等)和硬编码_thumbnail名称后,那么这将是足够的。

换句话说,我想借此完整的文件名,并将其切成两个部分,这样我就可以插入字符串_thumbnail两个部分之间。

也许这会工作,但如果图像称为image.2horses.jpg(与文件名中的多个点的文件)上传什么? 在之前一个天真切“” 也不会在这里工作。

有没有办法来解决这个问题? 或许由最后4之前切割所述文件名向上( .jpg.png )或5( .jpeg )字符?

Answer 1:

鉴于在$文件名中的图像的文件名,

如果你可以假定所有的图像将在“.JPG”结束,不会有“.JPG”,在文件名的其他地方,那么这应该工作:

<img src="{substring-before($filename, '.jpg')}_thumbnail.jpg" ... />

如果你不知道图像类型(比如,你想处理GIF和PNG也一样),或者如果你想在文件名(“image.jpg.jpg”)可能会出现延期多次,那么你将要一个模板来帮助你:

<?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>


Answer 2:

关闭我的头顶:

<xsl:template name="substring-before-last">
  <xsl:param name="string1" select="''" />
  <xsl:param name="string2" select="''" />

  <xsl:if test="$string1 != '' and $string2 != ''">
    <xsl:variable name="head" select="substring-before($string1, $string2)" />
    <xsl:variable name="tail" select="substring-after($string1, $string2)" />
    <xsl:value-of select="$head" />
    <xsl:if test="contains($tail, $string2)">
      <xsl:value-of select="$string2" />
      <xsl:call-template name="substring-before-last">
        <xsl:with-param name="string1" select="$tail" />
        <xsl:with-param name="string2" select="$string2" />
      </xsl:call-template>
    </xsl:if>
  </xsl:if>
</xsl:template>

被称为:

<xsl:template match="/">

  <xsl:variable name="filename" select="'image.2horses.jpg'" />

  <xsl:variable name="basename">
    <xsl:call-template name="substring-before-last">
      <xsl:with-param name="string1" select="$filename" />
      <xsl:with-param name="string2" select="'.'" />
    </xsl:call-template>
  </xsl:variable>

  <xsl:value-of select="$basename" />

</xsl:template>

产量:

image.2horses


Answer 3:

只涉及标准的XSLT的一般解是有点难,因为你必须寻找从结束的字符串。 您可以分割你的文件名usings两个功能,串 - 前 - 最后和子 - 后最后。 不幸的是,这些功能都没有XSLT的一部分。 你可以谷歌和试图找到的实现 。 假设你已经作为XSLT模板,那么你可以使用下面的模板来生成缩略图名实现这两个函数:

<xsl:template name="thumbnail-name">
  <xsl:param name="file-name"/>
  <xsl:call-template name="substring-before-last">
    <xsl:with-param name="text" select="$file-name"/>
    <xsl:with-param name="chars" select="'.'"/>
  </xsl:call-template>
  <xsl:text>_thumbnail.</xsl:text>
  <xsl:call-template name="substring-after-last">
    <xsl:with-param name="text" select="$file-name"/>
    <xsl:with-param name="chars" select="'.'"/>
  </xsl:call-template>
</xsl:template>

你可以使用这样的模板(假设变量$文件名中包含图片的名称):

<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>


Answer 4:

有一个看看在W3Schools的XPath函数的概述 ,特别是substring-before法。



Answer 5:

我相信对字符串操作的XPath功能可以帮助你。 我会用一些简单的尝试replacetranslate



Answer 6:

XSLT使用正则表达式2溶液:

replace($filename, '(\.[^\.]*)$', concat('_thumbnail', '$1'))

原来的答案(也XSLT 2):这消除了最后的分离器(包括分离)后所有。 所以下面的$ separatorRegexp可能是“\ .JPG”或只是“\”。 和$分隔名为.jpg'或“” 在另一种情况。

string-join(reverse(remove(reverse(tokenize($filename, $separatorRegexp)),1)),$separator)

最终,“_thumbnail.jpg”可以用的concat追加。



文章来源: Removing the last characters in an XSLT string
标签: image xslt