有没有办法从字符串中获取数字并使用 XSLT 计算相同的总和?

Posted

技术标签:

【中文标题】有没有办法从字符串中获取数字并使用 XSLT 计算相同的总和?【英文标题】:Is there any way to get number out of String and Calculate Sum of the same using XSLT? 【发布时间】:2021-10-23 15:17:15 【问题描述】:

字符串,例如-

         10 AL @ 6' X 32' ROOFTOP
          5 AL @ 6' X 32' ROOFTOP
          4 AL @ 6' X 32' ROOFTOP
          6 AL @ 6' X 32' ROOFTOP

我需要提取 AL 之前的所有数字并从中计算总和。

我尝试使用 但我得到了 NaN 作为输出。

来自 cmets

<part_d>
    <description label="Description Part">1 RL @ 4' X 32'</description>
    <description label="Description Part">10 RL @ 4' X 32'</description> 
    <description label="Description Part">5 RL @ 4' X 32'</description> 
    <description label="Description Part">8 RL @ 4' X 32'</description> 
    <description label="Description Part">9 RL @ 4' X 32'</description> 
</part_d>

【问题讨论】:

请详细说明您要从字符串样本中提取和求和的确切数字。一般来说,您使用哪个 XSLT 处理器,哪个 XSLT 版本? XSLT 2 和 3 分别由 xsl:analyze-stringanalyze-string 提供正则表达式支持,可以轻松拆分该字符串,当然然后对数字组成部分求和。 抱歉格式错误。我使用的工具支持 XSLT 1。实际字符串是 10 AL @ 6' X 32' ROOFTOP。所以我需要从 AL 之前的那个字符串中提取数字 10。由于会有多个相同格式的字符串,所以我需要显示 AL 的总数。 它真的只是一个字符串,覆盖多行,你有吗?或者所有字符串都是分开的,每个都在不同的元素中?如果您显示包含字符串数据的实际 XML,将会有所帮助。谢谢! '1 RL @ 4' X 32'10 RL @ 4' X 32' 5 RL @ 4' X 32'8 RL @ 4' X 32'9 RL @ 4' X 32'' @TimC 请不要在 cmets 中发布代码。编辑您的问题并将其添加到那里。 【参考方案1】:

XSLT 1.0 中的 sum() 函数只能对数字求和,不能进行计算。试试这个方法:

XSLT 1.0 (+EXSLT)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="part_d">
    <xsl:variable name="quantities">
        <xsl:for-each select="description">
            <q>
                <xsl:value-of select="substring-before(., ' ')" />
            </q>
        </xsl:for-each>
    </xsl:variable>
    <total-quantity>
        <xsl:value-of select="sum(exsl:node-set($quantities)/q)" />     
    </total-quantity>
</xsl:template>

</xsl:stylesheet>

或者,如果您愿意:

XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="part_d">
    <total-quantity>
        <xsl:call-template name="add">
            <xsl:with-param name="items" select="description"/>
        </xsl:call-template>
    </total-quantity>
</xsl:template>

<xsl:template name="add">
    <xsl:param name="items" select="/.."/>
    <xsl:param name="sum" select="0"/>
    <xsl:choose>
        <xsl:when test="$items">
            <xsl:variable name="item" select="$items[1]" />
            <xsl:variable name="n" select="substring-before($item, ' ')" />
            <!-- recursive call -->
            <xsl:call-template name="add">
                <xsl:with-param name="items" select="$items[position() > 1]"/>
                <xsl:with-param name="sum" select="$sum + $n"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sum"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

【讨论】:

非常感谢@michael.hor257k。 XSLT 1.0 (+EXSLT) 为我工作。

以上是关于有没有办法从字符串中获取数字并使用 XSLT 计算相同的总和?的主要内容,如果未能解决你的问题,请参考以下文章

从Int获取单个数字而不使用字符串?

从字符串向量中获取字符

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

如何计算 XSLT 中数字的绝对值?

从特定字符串中获取数字的 Lambda 函数

如何在 XSLT 1.0 中获取具有唯一数字的数字?