使用 XSLT 在字符串中添加数字

发布于 2024-11-04 04:50:09 字数 116 浏览 0 评论 0原文

我有一个字符串(在变量中),其中包含由空格或逗号分隔的数字列表。 我需要对字符串中的数字求和。 示例字符串“1,2,5,12,3” 或“1 2 5 12 3”

有没有办法将字符串中的数字相加并返回总数?

I have a string (in a variable) that has a list of numbers separated by space or comma.
I need to sum the numbers in the string.
example string "1,2,5,12,3"
or "1 2 5 12 3"

Is there a way to add the numbers within the string and return the total?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

枕头说它不想醒 2024-11-11 04:50:09

这种更短的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()" name="sumStringList">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pSum" select="0"/>
  <xsl:param name="pDelim" select="','"/>

  <xsl:choose>
   <xsl:when test="not(string-length($pText) >0)">
     <xsl:value-of select="$pSum"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:variable name="vnewList"
         select="concat($pText,$pDelim)"/>
    <xsl:variable name="vHead" select=
     "substring-before($vnewList, $pDelim)"/>
    <xsl:call-template name="sumStringList">
     <xsl:with-param name="pText" select=
     "substring-after($pText, $pDelim)"/>
     <xsl:with-param name="pSum" select="$pSum+$vHead"/>
     <xsl:with-param name="pDelim" select="$pDelim"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

当应用于以下 XML 文档时

<t>1,2,5,12,3</t>

产生所需的正确结果

23

解释:递归调用也匹配的命名模板一个文本节点。添加哨兵(附加逗号)以加速和简化处理。

二. XSLT 2.0 解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:param name="pDelim" select="','"/>

 <xsl:template match="text()">
  <xsl:sequence select=
   "sum(for $s in tokenize(.,$pDelim)
         return number($s)
        )
   "/>
 </xsl:template>
</xsl:stylesheet>

当应用于同一个 XML 文档(上面)时,此转换会产生相同的所需正确答案

23

这里我们使用标准 XPath 2.0 函数 tokenize() 我们必须将每个生成的标记转换为数字(使用 number() 函数),然后最终应用标准 XPath 函数 sum()

This much shorter transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()" name="sumStringList">
  <xsl:param name="pText" select="."/>
  <xsl:param name="pSum" select="0"/>
  <xsl:param name="pDelim" select="','"/>

  <xsl:choose>
   <xsl:when test="not(string-length($pText) >0)">
     <xsl:value-of select="$pSum"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:variable name="vnewList"
         select="concat($pText,$pDelim)"/>
    <xsl:variable name="vHead" select=
     "substring-before($vnewList, $pDelim)"/>
    <xsl:call-template name="sumStringList">
     <xsl:with-param name="pText" select=
     "substring-after($pText, $pDelim)"/>
     <xsl:with-param name="pSum" select="$pSum+$vHead"/>
     <xsl:with-param name="pDelim" select="$pDelim"/>
    </xsl:call-template>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

when applied on the following XML document:

<t>1,2,5,12,3</t>

produces the wanted, correct result:

23

Explanation: Recursively called named template that also matches a text node. A sentinel (appended comma) is added to speed up and streamline processing.

II. XSLT 2.0 solution:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:param name="pDelim" select="','"/>

 <xsl:template match="text()">
  <xsl:sequence select=
   "sum(for $s in tokenize(.,$pDelim)
         return number($s)
        )
   "/>
 </xsl:template>
</xsl:stylesheet>

When applied on the same XML document (above), this transformation produces the same wanted, correct answer:

23

Here we use the standard XPath 2.0 function tokenize() and we must convert every resulting token to number (using the number() function) before finally applying the standard XPath function sum().

很快妥协 2024-11-11 04:50:09

我不了解 XSLT,但通常您会使用空格和逗号作为分隔符来分割字符串。
经过快速搜索后,我发现如果您使用的是 XSLT 2.0,则可以使用 tokenize(string,separator) 作为分割函数。 此页面有一个关于如何使用标记化

I don't know XSLT, but generally you would split the string using spaces and commas as separators.
After a quick search I found that you can use tokenize(string, separator) as the split function if you are using XSLT 2.0. This page has an example on how to use tokenize.

情绪操控生活 2024-11-11 04:50:09

这是一个 XSLT 1.0 解决方案

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">

        <xsl:variable name="listOfValues" select="'1,2,5,12,3'" />

        <xsl:call-template name="splitAndAdd">
            <xsl:with-param name="list" select="$listOfValues"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="splitAndAdd">
        <xsl:param name="list" />
        <xsl:param name="delimiter" select="','"/>
        <xsl:param name="total" select="0" />

        <xsl:variable name="newList">
            <xsl:choose>
                <xsl:when test="contains($list, $delimiter)">
                    <xsl:value-of select="normalize-space($list)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat(normalize-space($list),$delimiter)" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="token" 
                      select="substring-before($newList, $delimiter)" />
        <xsl:variable name="remaining" 
                      select="normalize-space(substring-after($newList, $delimiter))" />

        <xsl:variable name="newTotal" select="$total + number($token)" />

        <xsl:choose>
            <xsl:when test="$remaining">
                <xsl:call-template name="splitAndAdd">
                    <xsl:with-param name="delimiter" select="$delimiter"/>
                    <xsl:with-param name="list" select="$remaining"/>
                    <xsl:with-param name="total" select="$newTotal" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$newTotal" />
            </xsl:otherwise>
        </xsl:choose>     

    </xsl:template>

</xsl:stylesheet>

Here is an XSLT 1.0 solution

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">

        <xsl:variable name="listOfValues" select="'1,2,5,12,3'" />

        <xsl:call-template name="splitAndAdd">
            <xsl:with-param name="list" select="$listOfValues"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="splitAndAdd">
        <xsl:param name="list" />
        <xsl:param name="delimiter" select="','"/>
        <xsl:param name="total" select="0" />

        <xsl:variable name="newList">
            <xsl:choose>
                <xsl:when test="contains($list, $delimiter)">
                    <xsl:value-of select="normalize-space($list)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat(normalize-space($list),$delimiter)" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="token" 
                      select="substring-before($newList, $delimiter)" />
        <xsl:variable name="remaining" 
                      select="normalize-space(substring-after($newList, $delimiter))" />

        <xsl:variable name="newTotal" select="$total + number($token)" />

        <xsl:choose>
            <xsl:when test="$remaining">
                <xsl:call-template name="splitAndAdd">
                    <xsl:with-param name="delimiter" select="$delimiter"/>
                    <xsl:with-param name="list" select="$remaining"/>
                    <xsl:with-param name="total" select="$newTotal" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$newTotal" />
            </xsl:otherwise>
        </xsl:choose>     

    </xsl:template>

</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文