“正则表达式”式在XSLT 1.0替换(“Regular expression”-style rep

2019-07-29 06:16发布

我需要执行一个查找和使用XSLT 1.0这实在是适合于正则表达式替换。 不幸的是,这些都没有在1.0可用,我也无法使用任何扩展库,如EXSLT由于安全设置,我不能改变。

我与长相工作的字符串,如:

19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson

我需要更换的数量和; # ; #字符用, 。 例如上面会改变为:

John Smith, Ben Reynolds, Terry Jackson

我知道一个递归字符串函数是必需的,可能使用串并转换,但我不知道从哪里开始使用它。

有没有人对如何来解决这一问题的一些指点? 这就是我已经开始与:

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

Answer 1:

我希望你没有简化了问题太多,要求其对SO,因为这不应该是太大的问题。

您可以定义模板,只要你保持输入字符串的格式一致的递归调用它。

例如,

<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];#[rest of string] 。 所述的每个呼叫TrimMulti模板印章断[number];#部和打印断[name]部分,随后将剩余的表达自身递归。

基础案例是当InputString的形式是[number];#[name] ,在这种情况下RemainingString变量将不包含;# 因为我们知道这是输入的结束,我们不输出逗号这段时间。



Answer 2:

如果“;” 和“#”字符不是输入,因为他们是分隔符,那么为什么不翻译功能的工作是否有效? 这可能是丑陋(你必须在第二个参数指定的所有有效字符,并重复他们的第三个参数),但它会更容易调试。

translate($InputString, ';#abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ', ', abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ')


文章来源: “Regular expression”-style replace in XSLT 1.0
标签: xslt xslt-1.0