开发者

xsl remove all non-numeric characters and leading 1

开发者 https://www.devze.com 2023-01-18 05:46 出处:网络
I need to convert incoming phone number strings to a standardized format开发者_如何学JAVA that does not have any non-numeric characters and strips off the leading number if it is 1.

I need to convert incoming phone number strings to a standardized format开发者_如何学JAVA that does not have any non-numeric characters and strips off the leading number if it is 1.

For example:

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

Thanks in advance for your help!


I. XSLT 1.0 solution:

This transformation:

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

when applied on this XML document:

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

produces the wanted, correct result:

22233344445555

Explanation:

  1. The expression: translate(.,'0123456789','') is evaluated to a string that contains all non-numeric characters in the current node.

  2. We use 1. above in the expression:

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

and this evaluates to a string where all non-numeric characters from the current node are deleted.

.3. The expression: (substring($vnumsOnly,1,1)='1') +1)" evaluates to 2 if the first character of $vnumsOnly is '1' and it evaluates to 1 if the starting character isn't '1'.

.4. We use 3. in the following expression:

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

which evaluates to the same string $vnumsOnly if it doesn't start with '1' and it evaluates to its substring starting from the 2nd character, if the first character is '1'.


II. XPath 2.0 solution:

Just use:

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

The inner replace removes all characters that aren't 0 through 9 (digits). The outer replace removes the leading 1 (if it exists).


This stylesheet:

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

With this input:

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

Output:

22233344445555


replace(replace(., '[^1-9]', ''), '^1', '') - I am responding to this... Instead of [^1-9]... Use [^0-9] otherwise any 0's in the phone number get deleted. But other than that this fixed my Workday integration issue great!


You could use nested replace xpath functions. The insider would change the first digit to space if it is 1, the outsider would change nondigits to space.

0

精彩评论

暂无评论...
验证码 换一张
取 消