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

时间:2010-09-29 12:55:43

标签: xslt transformation

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

例如:

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

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:20)

<强>予。 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.以上:

    翻译(。,翻译(。,'0123456789',''),'')

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

    0.3。如果(substring($vnumsOnly,1,1)='1') +1)"的第一个字符为2,则表达式$vnumsOnly评估为'1',如果起始字符不为“1”,则表达式评估为1

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

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

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


    <强> II。 XPath 2.0解决方案:

    只需使用

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

替换(替换(。,&#39; [^ 1-9]&#39;,&#39;&#39;),&#39; ^ 1&#39;,&#39;&# 39;) - 我对此做出回应...而不是[^ 1-9] ...使用[^ 0-9]否则电话号码中的任何0都会被删除。但除此之外,这修复了我的Workday集成问题!

答案 3 :(得分:0)

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