Суммировать содержимое столбца на основе переменной с XPath - PullRequest
0 голосов
/ 04 декабря 2009

Я немного новичок, когда дело доходит до XSLT и XPath, поэтому столкнулся с этой проблемой. Я создаю простую таблицу, основанную на представлении базы данных, которая должна суммировать некоторые столбцы в представлении. Я подумал, что могу добавить «SUM_» в качестве префикса всех кумнов, которые я хочу суммировать, и обрезать этот тег подстрокой, когда должно быть показано имя кулона.

Вот пример моего 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 ]

1 голос
/ 04 декабря 2009

Сейчас я не могу проверить это, но попробуйте:

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

Это сумма элементов (любой элемент, следовательно, "*"), где имя равно атрибуту описания текущего узла.

0 голосов
/ 04 декабря 2009

Я думаю, что вы хотите:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...