Вот решение XSLT 1.0 (XSLT 2.0 обладает гораздо более мощными функциями для обработки строк, такими как регулярные выражения):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="processing-instruction()">
<xsl:variable name="vpostHref"
select="substring-after(., 'href=')"/>
<xsl:variable name="vhrefData1"
select="substring($vpostHref,2)"/>
<xsl:variable name="vhrefData2"
select="substring($vhrefData1, 1,
string-length($vhrefData1)-1
)"/>
<xsl:call-template name="stripBackwards">
<xsl:with-param name="pText"
select="$vhrefData2"/>
<xsl:with-param name="pTextLength"
select="string-length($vhrefData2)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="stripBackwards">
<xsl:param name="pText"/>
<xsl:param name="pStopChar" select="'\'"/>
<xsl:param name="pTextLength"/>
<xsl:choose>
<xsl:when test="not(contains($pText, $pStopChar))">
<xsl:value-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="vLastChar"
select="substring($pText,$pTextLength,1)"/>
<xsl:choose>
<xsl:when test="$vLastChar = $pStopChar">
<xsl:value-of select="substring($pText,1,$pTextLength -1)"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="stripBackwards">
<xsl:with-param name="pText"
select="substring($pText,1,$pTextLength -1)"/>
<xsl:with-param name="pTextLength" select="$pTextLength -1"/>
<xsl:with-param name="pStopChar" select="$pStopChar"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML :
<?xml-stylesheet type="text/xsl" href=".\Files\Style\test.xsl"?>
<t/>
получен правильный результат :
.\Files\Style