【问题标题】:How do I convert strings starting with numbers to numeric data in XSLT?如何在 XSLT 中将以数字开头的字符串转换为数字数据?
【发布时间】:2011-01-14 21:43:31
【问题描述】:

给定以下 XML:

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

如何将宽度属性转换为可用于数学表达式的数值?到目前为止,我已经使用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更有效的转换方式?
  • 如果我不知道数字后面的文字怎么办?不使用正则表达式有什么办法吗?

【问题讨论】:

  • 感谢您的所有回答。为了确定哪个答案最符合我的标准,我创建了一个基准:一个包含 10000 列的表,使用 -repeat 选项在 saxon 中运行样式表 1000 次,并记下转换的平均执行时间。结果如下:AakashM 解决方案是最快的(110 毫秒),但需要事先知道属性中的所有字符。我的解决方案(substring-before)在效率类别(115ms)中排名第二。当文本未知时,Dimitre 的解决方案(125ms)比使用正则表达式(130ms)更快。
  • 这些数字也表明这不是优化样式表的正确位置:)

标签: xslt string types type-conversion


【解决方案1】:

这太可怕了,但取决于您对一组潜在的非数字字符的了解程度,您可以使用 translate() 去除它们:

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

返回

"12"

然后您可以像当前一样将其传递给number()

(我说这很糟糕。注意translate() 也区分大小写)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      它使用嵌套翻译从字符串中去除所有数字,从而产生所有其他字符,这些字符用作包装翻译函数的值以去除并仅返回数字字符。

      应用于您的模板:

      <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>
      

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2022-01-09
        相关资源
        最近更新 更多