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
Объяснение :
Выражение: translate(.,'0123456789','')
оценивается как строка, содержащая все нечисловые символы в текущем узле.
Мы используем 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 (если она существует).