我已经编写了一个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 ??
答案 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>