XSL удалить все нечисловые символы и ведущие 1 - PullRequest
8 голосов
/ 29 сентября 2010

Мне нужно преобразовать входящие строки телефонных номеров в стандартизированный формат, который не содержит никаких нецифровых символов и удаляет первый номер, если он равен 1.

Например:

«+1 (222) 333-4444 x 5555» становится «22233344445555»

Заранее благодарим за помощь!

Ответы [ 4 ]

20 голосов
/ 29 сентября 2010

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', ''), '')

, и в результате получается строка, в которой все нечисловые символы из текущего узла удалены.

0,3.Выражение: (substring($vnumsOnly,1,1)='1') +1)" оценивается как 2, если первый символ $vnumsOnly равен '1', и равно 1, если начальный символ не равен '1'.

.4.Мы используем 3. в следующем выражении:

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

, которое оценивается в ту же строку $vnumsOnly, если оно не начинается с '1', и вычисляет его подстроку, начиная со 2-го символа, еслипервый символ - «1».


II.Решение XPath 2.0:

Просто используйте :

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

Внутренняя замена удаляет все символы, которые не являются от 0 до 9 (цифры).Внешняя замена удаляет ведущую 1 (если она существует).

1 голос
/ 11 марта 2016

заменить (заменить (., '[^ 1-9]', ''), '^ 1', '') - я отвечаю на это ... Вместо [^ 1-9] ... Используйте [^ 0-9], иначе любые 0 в номере телефона будут удалены. Но кроме этого, это исправило мою проблему интеграции с Workday!

1 голос
/ 29 сентября 2010

Эта таблица стилей:

<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
0 голосов
/ 29 сентября 2010

Вы можете использовать вложенные функции replace xpath.Инсайдер изменил бы первую цифру на пробел, если она равна 1, аутсайдер изменил бы не цифры на пробел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...