如何在XSLT中将以数字开头的字符串转换为数字数据?

时间:2010-02-09 16:46:56

标签: xslt string types type-conversion

给出以下XML:

<table>
  <col width="12pt"/>
  <col width="24pt"/>
  <col width="12pt"/>
  <col width="48pt"/>
</table>

如何将width属性转换为可在数学表达式中使用的数值?到目前为止,我已使用substring-before来执行此操作。这是一个示例模板(仅限XSLT 2.0),它显示了如何对值进行求和:

<xsl:template match="table">
    <xsl:text>Col sum: </xsl:text>
    <xsl:value-of select="sum(
        for $w 
        in col/@width 
        return number(substring-before($w, 'pt'))
     )"/>
</xsl:template>

现在我的问题:

  • 是否有比substring-before更有效的转化方式?
  • 如果我不知道数字后的文字怎么办?没有使用正则表达式的任何方法吗?

3 个答案:

答案 0 :(得分:2)

这太可怕了,但是根据你对一组非数字字符的了解程度,你可以用translate()剥离它们:

translate("12jfksjkdfjskdfj", "abcdefghijklmnopqrstuvwxyz", "")

返回

"12"

然后您可以将其传递给number()

(我说它太可怕了。请注意,translate()也区分大小写)

答案 1 :(得分:1)

如果您使用的是XSLT 2.0,是否有理由避免使用正则表达式?

最简单的解决方案可能是使用带有正则表达式模式的 replace function 匹配任何非数字字符并替换为空字符串:

replace($w,'[^0-9]','')

答案 2 :(得分:1)

我从this answer找到了Dimitre Novatchev,它提供了一个非常聪明的XPATH解决方案,它不使用正则表达式:

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

它使用嵌套的translate来删除字符串中的所有数字,这会产生所有其他字符,这些字符用作包装转换函数的值,用于去除并仅返回数字字符。

应用于您的模板:

<xsl:template match="table">
    <xsl:text>Col sum: </xsl:text>
    <xsl:value-of select="sum(
        for $w 
        in col/@width 
        return number(translate($w, translate($w,'0123456789', ''), ''))
     )"/>
</xsl:template>