去除所有非数字字符和前导1的XSL

8
我需要将传入的电话号码字符串转换为标准格式,该格式不包含任何非数字字符,并在号码前面去掉1。
例如:
"+1 (222) 333-4444 x 5555" 变成 "22233344445555"
感谢您的帮助!
4个回答

20

I. XSLT 1.0 解决方案:

这个转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()">
  <xsl:variable name="vnumsOnly" select=
  "translate(., translate(.,'0123456789',''), '')
  "/>

  <xsl:value-of select=
  "substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)"/>
 </xsl:template>
</xsl:stylesheet>

当应用于此 XML 文档时:

<t>"+1 (222) 333-4444 x 5555</t>

可以得到想要且正确的结果:

22233344445555

解释:

  1. 表达式translate(.,'0123456789','')会得到当前节点中所有非数字字符组成的字符串。

  2. 我们在以下表达式中使用了1.:

    translate(., translate(.,'0123456789',''), '')

这个表达式会返回一个删除了当前节点中所有非数字字符的字符串。

3. 表达式 (substring($vnumsOnly,1,1)='1') +1)" 会在 $vnumsOnly 的第一个字符是 '1' 时返回 2,否则返回 1

4. 我们在以下表达式中使用了3.:

substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)

如果字符串不以'1'开头,则其值为相同的字符串$vnumsOnly,如果第一个字符是'1',则其值为从第二个字符开始的子串。


II. XPath 2.0解决方案:

只需使用:

replace(replace(., '[^0-9]', ''), '^1', '')

内部的replace删除所有不是0到9(数字)的字符。外部的replace删除前导的1(如果存在)。


1
谢谢!这个完美地运作了。我也非常感激您的解释。 - MattM
@DimitreNovatchev这个方法能否用于上面的翻译?使用以下语句translate($phone,'0123456789'+$phone,'0123456789')而不是 translate(., translate(.,'0123456789',''), '')哪一个更好? - Nateous
1
@Nate,你提出的表达式可能会产生正确的结果。然而,它可能需要大量内存 -- 尤其是当输入字符串非常长时。"双重翻译"方法不会构造一个比输入字符串更长的第二个字符串。 - Dimitre Novatchev

1

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:variable name="vPhone"
          select="translate(Phone,translate(Phone,'0123456789',''),'')"/>
        <xsl:value-of 
                select="substring($vPhone, 1 + starts-with($vPhone,'1'))"/>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<Phone>+1 (222) 333-4444 x 5555</Phone>

输出:

22233344445555

@Alejandro:完美的解决方案甚至在我之前几秒钟就提交了。 :) - Dimitre Novatchev

1

replace(replace(., '[^1-9]', ''), '^1', '') - 我在回应这个问题... 替换 [^1-9] 为 [^0-9],否则电话号码中的任何 0 都会被删除。除此之外,这个解决方案很好地解决了我的 Workday 集成问题!


0

您可以使用嵌套的replace xpath函数。内部函数将把第一个数字更改为空格,如果它是1,则外部函数将把非数字更改为空格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接