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

Inf*_*nd' 3 xml xslt

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

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

<xml>
  <tag>10a08bOE9W234 W30D:S</tag>
  <tag>10.233.23</tag>
</xml>
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的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>
Run Code Online (Sandbox Code Playgroud)

输出..

  <tag>1008923430</tag>
  <tag>1023323</tag>
Run Code Online (Sandbox Code Playgroud)

..
而且..我想要第二个标签输出就像10.23323ie,只允许第一个小数点.而忽略后续的那些..

是否只能使用XSLT 1.0?

Dim*_*hev 5

第一行的单个XPath表达式:

translate(., translate(.,'0123456789', ''), '')

请注意,任何非数字字符(事先未知)都将被删除.

对于第二行使用:

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

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

    translate(
        substring-after(
                  translate(., translate(.,'.0123456789', ''), ''),
                  '.'
                  ),
        '.',
        ''
        )
    )
Run Code Online (Sandbox Code Playgroud)

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

   . 
Run Code Online (Sandbox Code Playgroud)

concat(.,'.0')