使用XSLT 1.0从字符串中提取数字(+ int / decimal)

时间:2010-02-11 06:40:09

标签: xml xslt

我已经编写了一个XSLT代码来从字符串中提取数字字符..

这是测试xml:
(看起来很奇怪,但我期待XSLT很多)

<xml>
  <tag>10a08bOE9W234 W30D:S</tag>
  <tag>10.233.23</tag>
</xml>

这是我正在尝试的XSLT代码:

<xsl:template match="tag">
  <tag>
  <xsl:value-of select="number(translate(., 'a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|.|:| ', ''))"/>
<!-- I am not happy writing this line .. is there any light weight code replacement-->
  </tag>
</xsl:template>

输出..

  <tag>1008923430</tag>
  <tag>1023323</tag>

..
而且..我希望第二个标签输出像10.23323,即仅允许第一个小数点.并忽略后续的那些......

只能使用XSLT 1.0 ??

2 个答案:

答案 0 :(得分:5)

第一行的单个XPath表达式

<强> translate(., translate(.,'0123456789', ''), '')

请注意,任何非数字字符(事先未知)将被剥离。

对于第二行使用

   concat(
    substring-before(
        translate(., translate(.,'.0123456789', ''), ''),
        '.'
              ),

    substring(
        translate(., translate(.,'.', ''), ''),
         1,
         1
        ),

    translate(
        substring-after(
                  translate(., translate(.,'.0123456789', ''), ''),
                  '.'
                  ),
        '.',
        ''
        )
    )

两种解决方案都可以组合成一个单独的XPath表达式:只需在第二个解决方案中替换

   . 

concat(。,'。0')

答案 1 :(得分:3)

首先,我认为你不需要翻译中的'pipe'字符。 translate函数适用于单个字符,因此您只需添加一个包含所有字符的连接字符串。

要仅输出第一个小数点,我认为您可以使用substring-before和substring-after来提取小数点前后的部分,对于第一个小数点后的位,您可以删除剩余的小数分。

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="tag">
      <xsl:variable name="NumberWithDots" select="translate(., 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ: ', '')"/>
      <tag>
         <xsl:choose>
            <xsl:when test="contains($NumberWithDots, '.')">
               <xsl:value-of select="substring-before($NumberWithDots, '.')"/>
               <xsl:text>.</xsl:text>
               <xsl:value-of select="translate(substring-after($NumberWithDots, '.'), '.', '')"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="number($NumberWithDots)"/>
            </xsl:otherwise>
         </xsl:choose>
      </tag>
   </xsl:template>
</xsl:stylesheet>