2009-12-04 6 views
0

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

Вот ан примере моего 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. Надеюсь, что-нибудь е может помочь мне найти решение =) До тех пор, я не должен буду хардкор столбцы, которые нужно получить суммируются ..

ответ

1

Я не могу проверить это на данный момент, но попробовать:

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

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

+0

Я проверил это, и это работает! –

+0

Приятно знать! Спасибо – Murph

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> 
+0

Выглядит как итог в нижней части столбцов суммируемых строк. – Murph

+0

Да, это произошло и сейчас. ;-) – Tomalak

Смежные вопросы