我需要将传入的电话号码字符串转换为标准格式,该格式不包含任何非数字字符,并在号码前面去掉1。
例如:
"+1 (222) 333-4444 x 5555" 变成 "22233344445555"
感谢您的帮助!
例如:
"+1 (222) 333-4444 x 5555" 变成 "22233344445555"
感谢您的帮助!
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',''), '')
这个表达式会返回一个删除了当前节点中所有非数字字符的字符串。
3. 表达式 (substring($vnumsOnly,1,1)='1') +1)"
会在 $vnumsOnly 的第一个字符是 '1' 时返回 2
,否则返回 1
。
4. 我们在以下表达式中使用了3.:
substring($vnumsOnly, (substring($vnumsOnly,1,1)='1') +1)
如果字符串不以'1'开头,则其值为相同的字符串$vnumsOnly
,如果第一个字符是'1',则其值为从第二个字符开始的子串。
II. XPath 2.0解决方案:
只需使用:
replace(replace(., '[^0-9]', ''), '^1', '')
内部的replace删除所有不是0到9(数字)的字符。外部的replace删除前导的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
replace(replace(., '[^1-9]', ''), '^1', '') - 我在回应这个问题... 替换 [^1-9] 为 [^0-9],否则电话号码中的任何 0 都会被删除。除此之外,这个解决方案很好地解决了我的 Workday 集成问题!
translate($phone,'0123456789'+$phone,'0123456789')
而不是translate(., translate(.,'0123456789',''), '')
哪一个更好? - Nateous