只选择它们之间带连字符的数字,并忽略任何其他字符

时间:2012-12-14 00:52:28

标签: xslt xpath

我有一个无法控制输入数据的场景,例如,我的输入可以是

<phoneNumber>6504323957</phoneNumber>

<phoneNumber>650-432-3957</phoneNumber>

<phoneNumber>(650)432-3957</phoneNumber>

<phoneNumber>650.432.3957</phoneNumber>

但是我的输出应该总是像这样

<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>

我正在尝试使用以下xsl实现此目的,该xsl仅适用于一种不适用于其他条件的情况。

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:element name="areaCode">
<xsl:value-of select="substring(phoneNumber,1,3)"/>
</xsl:element>
<xsl:element name="phoneNumber">
<xsl:value-of select="substring(phoneNumber,5,12)"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

任何帮助都将受到高度赞赏。

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <xsl:variable name="numbersonly" select="translate(phoneNumber, translate(phoneNumber,'0123456789',''), '')"/>
    <xsl:element name="areaCode">
        <xsl:value-of select="substring($numbersonly,1,3)"/>
    </xsl:element>
    <xsl:element name="phoneNumber">
        <xsl:value-of select="substring($numbersonly,4,3)"/>-<xsl:value-of select="substring($numbersonly,7,4)"/>
    </xsl:element>
</xsl:template>

要处理没有区号的输入,你可以使用一些简单的数学,并从右边而不是从左边选择(假设一个完整的手机是10位数)..

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <xsl:variable name="numbersonly" select="translate(phoneNumber, translate(phoneNumber,'0123456789',''), '')"/>
    <xsl:variable name="length" select="string-length($numbersonly)"/>
    <xsl:element name="areaCode">
        <xsl:value-of select="substring($numbersonly,$length -9,3)"/>
    </xsl:element>
    <xsl:element name="phoneNumber">
        <xsl:value-of select="substring($numbersonly,$length -6,3)"/>-<xsl:value-of select="substring($numbersonly,$length -3,4)"/>
    </xsl:element>
</xsl:template>

答案 1 :(得分:2)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="phoneNumber">
  <xsl:variable name="vbareNum" select="translate(.,'-().','')"/>
  <areaCode><xsl:value-of select="substring($vbareNum,1,3)"/></areaCode>
  <phoneNumber>
   <xsl:value-of select=
   "concat(substring($vbareNum,4,3),'-',substring($vbareNum,7))"/>
  </phoneNumber>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<nums>
    <phoneNumber>6504323957</phoneNumber>
    <phoneNumber>650-432-3957</phoneNumber>
    <phoneNumber>(650)432-3957</phoneNumber>
    <phoneNumber>650.432.3957</phoneNumber>
</nums>

生成想要的正确结果

<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>
<areaCode>650</areaCode>
<phoneNumber>432-3957</phoneNumber>