Сводная таблица XSLT - PullRequest
       7

Сводная таблица XSLT

1 голос
/ 06 октября 2009

Я новичок в работе с XSLT и пытаюсь создать сводную таблицу с использованием метода Мюнхена (поскольку кажется, что IE все еще не поддерживает XSLT 2.0, я думаю, что я застрял с этим). Я могу получить желаемую группу, однако я пытаюсь получить сумму атрибута для каждой группы. Для суммирования атрибута я могу использовать функцию совокупной суммы или мне нужно перебрать ключи и сохранить значения в переменной? Это то, что я до сих пор:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="UTF-8"/>

<xsl:key name="Person" match="Record" use="@PersonID" />
<xsl:template match="/">
  <html>
  <body>
    <h2>Costs Per Person</h2>
    <table border = "1">
        <thead>
        <tr>
           <th>ID</th>
           <th>Cost</th>
        </tr>
        </thead>
        <tbody>
        <xsl:for-each select="Records/Record[generate-id() = 
         generate-id(key('Person', @PersonID)[1])]">
        <tr>
            <td>
                <xsl:value-of select="@PersonID" />
            </td>

            <td>
                <!-- Sum Of Cost -->
            </td>
        </tr>   
       </xsl:for-each>  
       </tbody>
    </table>
  </body>
  </html>
</xsl:template>

Ответы [ 3 ]

1 голос
/ 06 октября 2009

Поскольку ваш текущий контекстный узел внутри цикла является элементом Record, вам необходимо убедиться, что ваша 'сумма' включает все записи с соответствующим атрибутом PersonID. Примерно так должно поступить:

<xsl:value-of select="sum(../Record[@PersonID=current()/@PersonID]/@Cost)" />

Или, поскольку вы знаете, что текущий элемент Record является первым с определенным атрибутом PersonID, вы также можете сделать это в этом случае

<xsl:value-of select="number(@Cost) + sum(following-sibling::Record[@PersonID=current()/@PersonID]/@Cost)" />
1 голос
/ 06 октября 2009

Легко - вы там, где уже есть. Смотрите полное решение ниже.

С другой стороны, я не советую использовать <xsl:for-each> в пользу <xsl:apply-templates>. Код становится немного длиннее, но читаемость и структура кода улучшаются, ИМХО.

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="html" indent="yes" encoding="UTF-8"/>

  <xsl:key name="Person" match="Record" use="@PersonID" />

  <xsl:template match="/">
    <html>
      <body>
        <h2>Costs Per Person</h2>
        <table border = "1">
          <thead>
            <tr>
               <th>ID</th>
               <th>Cost</th>
            </tr>
          </thead>
          <tbody>
            <xsl:apply-templates select="Records/Record" />
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Records/Record">
    <xsl:variable name="thisGroup" select"key('Person', @PersonID)" />

    <xsl:if test="generate-id() = generate-id($thisGroup[1])">
      <tr>
        <td>
          <xsl:value-of select="@PersonID" />
        </td>
        <td>
          <!-- Sum Of Cost -->
          <xsl:value-of select="sum($thisGroup/@Cost)" />
        </td>
      </tr>   
    </xsl:if>  
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 06 октября 2009

Вы должны иметь возможность использовать сумму, если вы можете использовать xpath для выбора атрибута для желаемой записи (записей).

Не зная структуры вашего ввода XML, я не знаю, что это будет, но я думаю, в вашем случае что-то вроде <xsl:value-of select="sum(@cost)"/>

...