1

私はXSLTを初めて使用し、Muenchianメソッドを使用してピボットテーブルを作成しようとしています(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>
4

3 に答える 3

1

簡単 - あなたはすでにそこにいます。以下の完全なソリューションを参照してください。

別の注意として、私は<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>
于 2009-10-06T09:23:13.717 に答える
1

ループ内の現在のコンテキスト ノードは Record 要素であるため、'sum' に一致する PersonID 属性を持つすべての Records が含まれていることを確認する必要があります。このようなことをする必要があります:

<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)" />
于 2009-10-06T07:41:35.013 に答える
0

xpath を使用して目的のレコードの属性を選択できる場合は、sum を使用できるはずです。

入力xmlの構造を知らなければ、これがどうなるかわかりませんが、あなたの場合は次のようなものだと思います<xsl:value-of select="sum(@cost)"/>

于 2009-10-05T23:01:06.757 に答える