2009-10-05 4 views
1

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

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

ответ

1

Easy - вы, где уже здесь. См. Полное решение ниже.

В другом примечании, я советую использовать <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

Это работает, спасибо за вашу помощь! – jwarzech

0

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

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

1

Потому что ваш текущий узел контекста внутри цикла является элементом записи, вам потребуется чтобы ваша сумма включала все записи с соответствующим атрибутом 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)" /> 
+0

Благодарим за указание на какой-то синтаксис, о котором я не знал. До сих пор мы провели всего пару дней с XSLT, и все примеры помогут! – jwarzech

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