我正在使用XSLT 1.0将XML数据输出转换为HTML。数据是从Adobe InDesign导出的,并生成用户计算机上图像位置的绝对链接。但是,最终的HTML文件将用于基于HTML的电子邮件系统。到图像的绝对链接需要转换为相对链接。是否有可能将任何绝对链接转换为基于web的图像文件到特定的相对链接?
XML图像元素看起来像这样:
<generic_image href="file:///MacProjects/Workflow/New%20Sample%20Data/Email_test_7-5/Surfaces/Images/Combo_logo_LO.png"></generic_image>
期望的HTML图像输出应该如下所示:
<img class="image" src="Images/Combo_logo_LO.png" style="max-width: 80%;">
我的XSL模板现在看起来像这样:
<xsl:template match="generic_image"><img class="image" src="{@href}" style="max-width: 80%;" /></xsl:template>
我如何从数据中提取图像名称并创建适当的相对路径?
仅供参考,绝对图像可能因用户而异,因此它可能与显示的图像不同。它也可以来自Mac或Windows电脑。
可以将递归模板与substring-after函数结合使用。基本思想是提取"/"之后的任何字符串,只要找到。
<xsl:template match="generic_image">
<xsl:call-template name="getFileName">
<xsl:with-param name="url">
<xsl:value-of select="@href"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="getFileName">
<xsl:param name="url"/>
<xsl:choose>
<xsl:when test="contains($url, '/')">
<xsl:call-template name="getFileName">
<xsl:with-param name="url">
<xsl:value-of select="substring-after($url, '/')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<img class="image" src="{$url}" style="max-width: 80%;" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>