【问题标题】:xsl remove all non-numeric characters and leading 1xsl 删除所有非数字字符和前导 1
【发布时间】:2016-08-13 05:34:50
【问题描述】:

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

例如:

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

提前感谢您的帮助!

【问题讨论】:

    标签: xslt transformation


    【解决方案1】:

    我。 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. above:

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

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

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

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

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

    如果不是以“1”开头,则计算为相同的字符串$vnumsOnly,如果第一个字符为“1”,则计算为从第二个字符开始的子字符串。


    二。 XPath 2.0 解决方案:

    只需使用

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

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

    【讨论】:

    • 谢谢!这完美地工作。我也非常感谢您的解释。
    • @DimitreNovaatchev 这也适用于上面的翻译吗? translate($phone,'0123456789'+$phone,'0123456789') 而不是 translate(., translate(.,'0123456789',''), '') 哪个更好?
    • @Nate,您提出的表达式可能会产生正确的结果。但是,它可能需要大量内存——尤其是当输入字符串非常长时。 “双重翻译”方法不会构造比输入字符串长的第二个字符串。
    【解决方案2】:

    这个样式表:

    <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: +1 完美的解决方案,甚至比我早几秒提交。 :)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多