代码之家  ›  专栏  ›  技术社区  ›  chiborg Alessandro Minoccheri

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

  •  2
  • chiborg Alessandro Minoccheri  · 技术社区  · 14 年前

    给定以下XML:

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

    如何将宽度属性转换为可以在数学表达式中使用的数值?到目前为止,我已经使用 substring-before 这样做。下面是一个示例模板(仅限XSLT2.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>
    

    现在我的问题是:

    • 有没有比 前子字符串 ?
    • 如果我不知道数字后面的文字怎么办?有没有办法不用正则表达式来完成这项工作?
    3 回复  |  直到 14 年前
        1
  •  1
  •   Community Reversed Engineer    7 年前

    我发现 this answer Dimitre Novatchev 它提供了一个非常聪明的不使用regex的xpath解决方案:

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

    它使用嵌套的translate从字符串中除去所有数字,从而生成所有其他字符,这些字符用作wrapping 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>
    
        2
  •  2
  •   AakashM    14 年前

    这太可怕了,但是根据你对非数字字符的潜在能力的了解程度,你可以去掉它们 translate() :

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

    收益率

    "12"
    

    然后你可以把它传给 number() 和目前一样。

    (我说这很可怕。注意 转换() 也区分大小写)

        3
  •  1
  •   Mads Hansen    14 年前

    如果您使用的是XSLT2.0,是否有理由避免使用regex?

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

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