xsl删除所有非数字字符并前导1

Mat*_*ttM 8 xslt transformation

我需要将传入的电话号码字符串转换为没有任何非数字字符的标准化格式,如果是1,则删除前导号码.

例如:

"+1(222)333-4444 x 5555"成为"22233344445555"

在此先感谢您的帮助!

Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

应用于此XML文档时:

<t>"+1 (222) 333-4444 x 5555</t>
Run Code Online (Sandbox Code Playgroud)

产生想要的,正确的结果:

22233344445555
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 表达式:translate(.,'0123456789','')被计算为包含当前节点中所有非数字字符的字符串.

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

    翻译(.,翻译(.,'0123456789',''),'')

这将计算为一个字符串,其中删除当前节点中的所有非数字字符.

0.3.表达式:(substring($vnumsOnly,1,1)='1') +1)"计算结果为2,如果的第一个字符$vnumsOnly'1'和它的计算结果为1如果起始字符不是"1".

0.4.我们在下面的表达式中使用3.:

substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)
Run Code Online (Sandbox Code Playgroud)

$vnumsOnly如果它不以'1'开头,则计算为相同的字符串,如果第一个字符为'1',则从第2个字符开始计算其子字符串.


II.XPath 2.0解决方案:

只需使用:

replace(replace(., '[^0-9]', ''), '^1', '')
Run Code Online (Sandbox Code Playgroud)

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