我需要使用非常适合正则表达式的XSLT 1.0执行查找和替换.不幸的是,这些在1.0中不可用,我也无法使用任何扩展库,如EXSLT,因为我无法更改安全设置.
我正在使用的字符串如下所示:
19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson
我需要; #用a 替换数字和字符,.例如,上面将改为:
John Smith, Ben Reynolds, Terry Jackson
我知道需要一个递归字符串函数,可能使用substring和translate,但我不知道从哪里开始.
有没有人对如何解决这个问题有一些指导?这是我开始的:
<xsl:template name="TrimMulti">
<xsl:param name="FullString" />
<xsl:variable name="NormalizedString">
<xsl:value-of select="normalize-space($FullString)" />
</xsl:variable>
<xsl:variable name="Hash">#</xsl:variable>
<xsl:choose>
<xsl:when test="contains($NormalizedString, $Hash)">
<!-- Do something and call TrimMulti -->
</xsl:when>
</xsl:choose>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
我希望你没有过多地简化问题,因为这不应该是一个问题.
只要保持输入字符串的格式一致,就可以定义模板并以递归方式调用它.
例如,
<xsl:template name="TrimMulti">
<xsl:param name="InputString"/>
<xsl:variable name="RemainingString"
select="substring-after($InputString,';#')"/>
<xsl:choose>
<xsl:when test="contains($RemainingString,';#')">
<xsl:value-of
select="substring-before($RemainingString,';#')"/>
<xsl:text>, </xsl:text>
<xsl:call-template name="TrimMulti">
<xsl:with-param
name="InputString"
select="substring-after($RemainingString,';#')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$RemainingString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
我通过以下调用测试了这个模板:
<xsl:template match="/">
<xsl:call-template name="TrimMulti">
<xsl:with-param name="InputString">19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson</xsl:with-param>
</xsl:call-template>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
得到以下输出:
John Smith, Ben Reynolds, Terry Jackson
Run Code Online (Sandbox Code Playgroud)
这似乎是你所追求的.
如果您熟悉函数式编程,那么对它的作用的解释很容易解释.该InputString参数总是在形式[number];#[name];#[rest of string].TrimMulti模板的每次调用都会切掉[number];#部件并打印出[name]部件,然后递归地将剩余的表达式传递给自身.
基本情况是InputString表单中的时间[number];#[name],在这种情况下RemainingString变量将不包含;#.由于我们知道这是输入的结束,所以这次我们不输出逗号.