基于具有XPath的变量对列的内容求和

时间:2009-12-04 13:09:45

标签: xml xslt xpath sum

对于XSLT和XPath,我有点像新手,所以我遇到了这个问题。 我正在基于数据库的视图创建一个简单的表,它需要对视图中的一些列求和。我能做的就是添加'SUM_'作为我想要求和的所有coumns的前缀,并在显示coulmn名称时用子串切断该标签。

以下是我的XML示例:

<Rowset>
    <Columns>
        <Column Description="SegmentResponseGlobId" MaxRange="1" MinRange="0" Name="SegmentResponseGlobId" SQLDataType="12" SourceColumn="SegmentResponseGlobId"></Column>
        <Column Description="Batch" MaxRange="1" MinRange="0" Name="Batch" SQLDataType="12" SourceColumn="Batch"></Column>
        <Column Description="Start" MaxRange="1" MinRange="0" Name="Start" SQLDataType="93" SourceColumn="Start"></Column>
        <Column Description="Slut" MaxRange="1" MinRange="0" Name="Slut" SQLDataType="93" SourceColumn="Slut"></Column>
        <Column Description="Rute" MaxRange="1" MinRange="0" Name="Rute" SQLDataType="8" SourceColumn="Rute"></Column>
        <Column Description="Tankvogn" MaxRange="1" MinRange="0" Name="Tankvogn" SQLDataType="8" SourceColumn="Tankvogn"></Column>
        <Column Description="SUM_Mængde" MaxRange="1" MinRange="0" Name="SUM_Mængde" SQLDataType="8" SourceColumn="SUM_Mængde"></Column>
        <Column Description="EquipmentId" MaxRange="1" MinRange="0" Name="EquipmentId" SQLDataType="12" SourceColumn="EquipmentId"></Column>
        <Column Description="SLS" MaxRange="1" MinRange="0" Name="SLS" SQLDataType="8" SourceColumn="SLS"></Column>
        <Column Description="PH" MaxRange="1" MinRange="0" Name="PH" SQLDataType="8" SourceColumn="PH"></Column>
    </Columns>
    <Row>
        <SegmentResponseGlobId>AD86D4EC-5E5E-4B6A-A3FC-4BEDF62F3545</SegmentResponseGlobId>
        <Batch>9492002</Batch>
        <Start>2009-12-01T11:13:43</Start>
        <Slut>2009-12-02T19:37:55</Slut>
        <Rute>0</Rute>
        <Tankvogn>6</Tankvogn>
        <SUM_Mængde>1</SUM_Mængde>
        <EquipmentId>A1_C1U11_Udvejning_råmælk</EquipmentId>
        <SLS>0</SLS>
        <PH>NA</PH>
    </Row>
    <Row>
        <SegmentResponseGlobId>28D65598-98D0-41CD-BB6B-6E962834D8F2</SegmentResponseGlobId>
        <Batch>Prod.Batch</Batch>
        <Start>2009-07-01T10:41:54</Start>
        <Slut>2009-12-04T07:42:40</Slut>
        <Rute>137</Rute>
        <Tankvogn>7037</Tankvogn>
        <SUM_Mængde>2</SUM_Mængde>
        <EquipmentId>A1_C1U02_Indvejning_2_råmælk</EquipmentId>
        <SLS>1</SLS>
        <PH>NA</PH>
    </Row>
</Rowset>

这是我的XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <table border="1">
            <thead>
                <xsl:for-each select="Rowsets/Rowset/Columns/Column">
                    <xsl:choose>
                        <xsl:when test="substring(@Description, 1, 4) = 'SUM_'">
                            <th><xsl:value-of select="substring(@Description,5)"/></th>
                        </xsl:when>
                        <xsl:otherwise>
                            <th><xsl:value-of select="@Description"/></th>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </thead>
            <tbody>
                <xsl:for-each select="Rowsets/Rowset/Row">
                    <tr>
                    <xsl:for-each select="child::*">
                        <td><xsl:value-of select="."/></td>
                    </xsl:for-each>
                    </tr>
                </xsl:for-each>
                <tr>
                <xsl:for-each select="Rowsets/Rowset/Columns/Column">               
                    <td>
                    <xsl:if test="substring(@Description, 1, 4) = 'SUM_'">
                        Sum: <xsl:value-of select="sum(/Rowsets/Rowset/Row/@Description)"/>
                    </xsl:if>
                    </td>
                </xsl:for-each>
                </tr>
            </tbody>
        </table>
    </xsl:template>
</xsl:stylesheet>

现在,正是这段代码给了我一些白发:

<xsl:for-each select="Rowsets/Rowset/Columns/Column">               
        <td>
        <xsl:if test="substring(@Description, 1, 4) = 'SUM_'">
        Sum: <xsl:value-of select="sum(/Rowsets/Rowset/Row/@Description)"/>
        </xsl:if>
    </td>
</xsl:for-each>

我似乎无法弄清楚如何将它与SUM_xxx列相加。 希望有人可以帮我找到解决方案=)在此之前,我将不得不核心需要总结的列...

2 个答案:

答案 0 :(得分:1)

我现在无法测试,但请尝试:

sum(/Rowsets/Rowset/Row/*[name()=current()/@Description])

这是元素的总和(任何元素,因此“*”),其中名称等于当前节点的描述属性。

答案 1 :(得分:0)

我想你想要:

<xsl:if test="substring(@Description, 1, 4) = 'SUM_'">
  <xsl:text>Sum: </xsl:text>
  <xsl:value-of select="
    sum(/Rowsets/Rowset/Row/*[name() = current()/@SourceColumn])
  "/>
</xsl:if>