我们具有以下XML,我们需要找到并替换SRC属性参数中的路径
<?xml version="1.0"?>
<ul>
<img src="/assets/myimage.png"/>
</ul>
以下是我的XSLT 1.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template name="globalReplace">
<xsl:param name="outputString"/>
<xsl:param name="target"/>
<xsl:param name="replacement"/>
<xsl:choose>
<xsl:when test="contains($outputString,$target)">
<xsl:value-of select="concat(substring-before($outputString,$target),$replacement)" />
<xsl:call-template name="globalReplace">
<xsl:with-param name="outputString" select="substring-after($outputString,$target)" />
<xsl:with-param name="target" select="$target" />
<xsl:with-param name="replacement" select="$replacement" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$outputString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@src">
<xsl:call-template name="globalReplace">
<xsl:with-param name="outputString" select="."/>
<xsl:with-param name="target" select="'/assets/'"/>
<xsl:with-param name="replacement" select="'/images/'"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="/ | node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*">
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
问题1 当我们执行转换时,我会得到以下结果
<img>/images/myimage.png</img>
而不是
<img src="/images/myimage.png"/>
问题2
XSLT转换没有保留
之类的属性<img src="/images/myimage.png" height="20"/>
我有一个为XSLT2.0提供的解决方案,但找不到任何参考。预先感谢!
XSLT变换不保留属性
您可以在 globalReplace 模板中更容易替换,并将匹配匹配为@src[parent::img]
,请参阅下面的XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template name="globalReplace">
<xsl:param name="param.str"/>
<xsl:param name="param.target"/>
<xsl:param name="param.replacement"/>
<xsl:choose>
<xsl:when test="contains($param.str, $param.target)">
<xsl:value-of select="concat(substring-before($param.str, $param.target), $param.replacement, substring-after($param.str, $param.target))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$param.str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@src[parent::img]">
<xsl:attribute name="src">
<xsl:call-template name="globalReplace">
<xsl:with-param name="param.str" select="."/>
<xsl:with-param name="param.target" select="'/assets/'"/>
<xsl:with-param name="param.replacement" select="'/images/'"/>
</xsl:call-template>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
那么您的结果将是:
<ul>
<img src="/images/myimage.png"/>
</ul>
您可以添加一个复制模板,将异常定义到@src
模板:
<xsl:template match="img/@*">
<xsl:copy>
<xsl:apply-templates select="@*" />
</xsl:copy>
</xsl:template>
这将其属性保留在其原始状态下的img
标签。