我需要使用XSLT将电话号码从+1 111-111-1234 x 7777777格式转换为11111111234。我试图使用translate('+'-'-'),但这会导致氧气错误。
谢谢
答案 0 :(得分:0)
我敢肯定有一种使用正则表达式的更干净的方法,但这可行:
<xsl:variable name="phoneNumber" select="'+1 111-111-1234 x 7777777'"/>
<xsl:value-of select="replace(replace(substring-after(substring-before($phoneNumber,'x'),'+'),' ',''),'-','')"/>
因此,如果您将其分解: 在“ x”之前的子字符串, 在“ +”之后的子字符串, 用'替换'', 用“。”替换“-”。
答案 1 :(得分:0)
translate()
的签名是:translate(string, string, string)
根据规范(上面的链接),“ 返回出现在第二个参数字符串中的字符替换为第三个参数字符串中相应位置的字符的第一个参数字符串”。 / p>
因此,如果要从字符串中删除数字以外的所有字符,则首先需要确定这些字符是什么:
translate(.,'0123456789','')
如果.
的字符串值为+1 111-111-1234 x 7777777
,则结果为字符串+ -- x
。
现在我们可以将这些字符翻译成.
:
translate(.,'+ -- x ','')
虽然我们可以做的是将两个translate()
调用嵌套在一起,所以内部调用的输出将用作外部调用的第二个参数字符串:
translate(.,translate(.,'0123456789',''),'')
这几乎给了我们所需的输出:
111111112347777777
,但我们还有多余的7777777
。我们需要在外部调用中获取x
之前的字符串...
translate(substring-before(.,'x'),translate(.,'0123456789',''),'')
这给了我们想要的输出:
11111111234
注意:我们还可以在内部转换调用中使用substring-before
(导致+ --
(缺少x
的注意)),但这实际上并没有改变输出。
这是一个完整的例子...
XML输入
<test>+1 111-111-1234 x 7777777</test>
XSLT 1.0 (有关XSLT 2.0+选项,请参见其他答案(以及我对该答案的评论))
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="test">
<xsl:copy>
<xsl:value-of select="translate(substring-before(.,'x'),
translate(.,'0123456789',''),'')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出
<test>11111111234</test>