【问题标题】:XSLT: sum of tree fragment will always return 0 !XSLT:树片段的总和将始终返回 0 !
【发布时间】:2009-02-17 14:22:58
【问题描述】:

我遇到了一个看起来很愚蠢的问题,但我找不到解决方案...使用 XLST,我需要对由模板计算的值列表求和。所以我将这些值存储在树结构中(根元素“Numbers”中包含的“Number”元素列表)。但无论我尝试对这个自制列表做什么,它都不会返回任何内容、0 或错误...

有人知道我做错了吗?

<!-- create the tree fragment -->
<xsl:variable name="_subTotals">
    <Numbers>
        <xsl:for-each select="List">
            <xsl:variable name="_Size">
                <xsl:call-template name="GetSize">
                    <xsl:with-param name="_value" select="@value"/>
                </xsl:call-template>
            </xsl:variable>
            <Number>
                <xsl:value-of select="$_Size"/>
            </Number>
        </xsl:for-each>
    </Numbers>
</xsl:variable>

<!-- this returns an error: expression must result into a node-set -->
<xsl:message terminate="no">
    <xsl:value-of select="sum($_subTotals/Numbers/Number)"/>
</xsl:message>

<!-- transform the tree fragment into a node-set
<xsl:variable name="_Total" select="msxsl:node-set($_subTotals)"/>

<!-- returns nothing -->
<xsl:for-each select="$_Total/Numbers/Number">
    <xsl:message terminate="no">
        <xsl:value-of select="@value"/>
    </xsl:message>
</xsl:for-each>

<!-- returns 0 -->
<xsl:value-of select="sum($_Total/Numbers/Number)"/>

【问题讨论】:

    标签: xslt sum rtf node-set


    【解决方案1】:

    这里是如何对动态生成的值求和的快速方法(可能您调用的模板没有产生预期的结果?如果是这样,您必须提出另一个问题并提供代码和代码操作的 XML 文档。没有这些,任何人都无法提供帮助,猜测也无用。):

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:ext="http://exslt.org/common"
     >
     <xsl:output method="text"/>
    
        <xsl:template match="/">
          <xsl:variable name="vrtfNums">
             <nums>
               <num>1</num>
               <num>2</num>
             </nums>
          </xsl:variable>
    
          <xsl:variable name="vNums" select="ext:node-set($vrtfNums)"/>
    
          <xsl:value-of select="sum($vNums/*/*)"/>
        </xsl:template>
    </xsl:stylesheet>
    

    当上述转换应用于任何 XML 文档(忽略)时,就会产生想要的结果

    3
    

    【讨论】:

      【解决方案2】:

      递归是函数式语言中的常见答案。比如:

      <xsl:template name='totalRest>
        <xsl:variable nane='sub'>
          <!-- Use for-each to set local new context node -->
          <xsl:for-each select='following::List[1]'>
            <xsl:call-template name='totalRest'/>
          </xsl:for-each>
        </xsl:variable>
        <xsl:variable name='this'>
          <xsl:call-template name="GetSize">
            <xsl:with-param name="_value" select="@value"/>
          </xsl:call-template>
        </xsl:variable>
      
        <xsl:value-of select='$sub+$this' />
      
      </xsl:template>
      

      如果不了解更多的 GetSize 和输入文档,很难更具体地了解正确的 XPath 以设置递归调用的上下文节点。

      【讨论】:

      • 对不起,不是很具体,但我试图简化问题。实际上我使用List元素的一个属性作为ID来获取输入文档中某处的其他属性值,然后是模板GetSize的参数(有3个)。
      • 但是谢谢你的回答,理查德!我会努力实现的。
      • 递归方法是通用的,但是细节(并确保 XPath 的上下文节点是可以的)并使其任意复杂:-(
      【解决方案3】:

      在我的情况下,我遇到了完全相同的问题,即 sum($something/element) 返回 0 并且 sum($something/*) 返回正确的值。

      我的问题是由以下 UBL Invoice 样式表声明引起的:

      xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"

      删除此行后,sum($something/element) 返回了正确的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多