template that does the replacement
File: Data.xml
<winelist>
<wine grape="Chardonnay">
<winery>shop 2</winery>
</wine>
<wine grape="Cabernet">
<winery>shop 1</winery>
</wine>
</winelist>
File: Transform.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="no" />
<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="year/text()">
<xsl:call-template name="globalReplace">
<xsl:with-param name="outputString" select="." />
<xsl:with-param name="target" select="'9'" />
<xsl:with-param name="replacement" select="'0'" />
</xsl:call-template>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?><winelist>
<wine grape="Chardonnay">
<winery>shop 2</winery>
</wine>
<wine grape="Cabernet">
<winery>shop 1</winery>
</wine>
</winelist>
Related examples in the same category