Редактировать : Как заметил @LarsH, я не обратил внимания на требование, чтобы замена была выделена жирным шрифтом.
Существует два простых способа исправить это:
.1. В преобразовании заменить :
<xsl:value-of select="$pRep"/>
на
<b><xsl:value-of select="$pRep"/></b>
.2. Передавать в качестве значения параметра pReplacement
не только "ABC"
, но <b>ABC</b>
Это преобразование XSLT 1.0 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pTarget" select="'test'"/>
<xsl:param name="pReplacement" select="'ABC'"/>
<xsl:variable name="vCaps" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLowecase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[not(ancestor::h1)]">
<xsl:call-template name="replaceCI">
<xsl:with-param name="pText" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replaceCI">
<xsl:param name="pText"/>
<xsl:param name="pTargetText" select="$pTarget"/>
<xsl:param name="pRep" select="$pReplacement"/>
<xsl:variable name="vLowerText"
select="translate($pText, $vCaps, $vLowecase)"/>
<xsl:choose>
<xsl:when test=
"not(contains($vLowerText, $pTargetText))">
<xsl:value-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vOffset" select=
"string-length(substring-before($vLowerText, $pTargetText))"/>
<xsl:value-of select="substring($pText,1,$vOffset)"/>
<xsl:value-of select="$pRep"/>
<xsl:call-template name="replaceCI">
<xsl:with-param name="pText" select=
"substring($pText, $vOffset + string-length($pTargetText)+1)"/>
<xsl:with-param name="pTargetText" select="$pTargetText"/>
<xsl:with-param name="pRep" select="$pRep"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):
<html>
<h1>This word should not be replaced: TEST</h1>.
But this one should be replaced: test
</html>
дает желаемый результат :
<html>
<h1>This word should not be replaced: TEST</h1>.
But this one should be replaced: ABC
</html>
Примечание :
Это общее преобразование , которое принимает в качестве параметров цель и текст замены.
Замена выполняется без учета регистра , но мы предполагаем, что целевой параметр указан в нижнем регистре.
Еще проще решить эту проблему с помощью XSLT 2.0 .