加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XSLT 1.0中的“正则表达式”式替换

发布时间:2020-12-14 05:58:50 所属栏目:百科 来源:网络整理
导读:我需要使用非常适合正则表达式的XSLT 1.0执行查找和替换.不幸的是,这些在1.0中不可用,我也无法使用任何扩展库,如EXSLT,因为我无法更改安全设置. 我正在使用的字符串如下所示: 19; #John Smith;#17; #Ben Reynolds;#1; #Terry Jackson 我需要更换数字; #个字
我需要使用非常适合正则表达式的XSLT 1.0执行查找和替换.不幸的是,这些在1.0中不可用,我也无法使用任何扩展库,如EXSLT,因为我无法更改安全设置.

我正在使用的字符串如下所示:

19; #John Smith;#17; #Ben Reynolds;#1; #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>

解决方法

我希望你没有过多地简化问题,因为这不应该是一个问题.

只要保持输入字符串的格式一致,就可以定义模板并以递归方式调用它.

例如,

<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>

我通过以下调用测试了这个模板:

<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>

得到以下输出:

John Smith,Ben Reynolds,Terry Jackson

这似乎是你所追求的.

如果您熟悉函数式编程,那么对它的作用的解释很容易解释. InputString参数的格式始终为[number];#[name];#[string of string]. TrimMulti模板的每次调用都会删除[number]; #part并打印[name]部分,然后递归传递剩余的表达式.

基本情况是InputString的格式为[number];#[name],在这种情况下RemainingString变量不包含;#.由于我们知道这是输入的结束,所以这次我们不输出逗号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读