0

XSL の使用を開始しましたが、固有の動的列データに問題があります。同様の問題について読んだことがありますが、この状況はかなり異なっているように思われるため、これらの解決策をこの問題に適用することはできません。

多数の<ID>との<Date>値で拡大または縮小できる次のサンプル データ セットがあります。

<Report>
  <DataSets>
    <Data>
      <ID>1</ID>
      <Date>201211</Date>
    </Data>
    <Data>
      <ID>1</ID>
      <Date>201211</Date>
    </Data>
    <Data>
      <ID>1</ID>
      <Date>201210</Date>
    </Data>
    <Data>
      <ID>2</ID>
      <Date>201209</Date>
    </Data>
    <Data>
      <ID>1</ID>
      <Date>201208</Date>
    </Data>
    <Data>
      <ID>2</ID>
      <Date>201208</Date>
    </Data>
    <Data>
      <ID>3</ID>
      <Date>201208</Date>
    </Data>
    <Data>
      <ID>3</ID>
      <Date>201208</Date>
    </Data>
  </DataSets>
</Report>

次のテーブルを生成する XSL コードを取得しようとしています。

ID  201208  201209  201210  201211
1     1       0       1       2 
2     1       1       0       0
3     2       0       0       0

列は動的で、列ヘッダーは<Date>要素の一意の値です。行は一意の ID のコレクションであり、データは<ID>for eachのカウントです<Date>。私が苦労しているのは、<ID>for eachのカウントを動的に作成すること<Date>です。

これまでのところ、テーブルを生成するキーを使用して次の XSL ファイルがありますが、ご覧のとおり、日付はハードコードされています。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0" >

<xsl:template match ="/" >
<html>
  <body>
    <xsl:apply-templates select="Report/DataSets"/>
  </body>
</html>
</xsl:template>

<xsl:key name="Data_ID" match="Data" use="ID" />
<xsl:key name="Data_D" match="Data" use="Date"/>
<xsl:template match="Report/DataSets" >
<table>
  <tr>
    <th>ID</th>
    <xsl:for-each select="Data[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
      <xsl:sort select="Date"/>
      <!-- Dynamically add headers for each Date Column -->
      <th><xsl:value-of select="Date"/></th>
    </xsl:for-each>
  </tr>
  <xsl:for-each select="Data[generate-id(.) = generate-id(key('Data_ID', ID)[1])]"> 
  <xsl:sort select="ID"/>
  <tr>
    <td><xsl:value-of select="ID"/></td>
    <!-- Dynamically count IDs for each Date Column -->
    <!-- How to do this step? -->
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201208'])"/></td>
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201209'])"/></td>
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201210'])"/></td>
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201211'])"/></td>
  </tr>
  </xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

これらのハードコードされたエントリを置き換えるために必要なもの

<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201208'])"/></td>
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201209'])"/></td>
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201210'])"/></td>
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201211'])"/></td>

動的コードで?

4

1 に答える 1

0

for-eachヘッダーに使用したものと同じ種類を使用できます

  <!-- store the full set of Data in a variable - we will need it inside the for-eaches -->
  <xsl:variable name="allData" select="Data"/>
  <xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_ID', ID)[1])]"> 
  <xsl:sort select="ID"/>
  <xsl:variable name="currentId" select="ID" />
  <tr>
    <td><xsl:value-of select="$currentId"/></td>
    <!-- Dynamically count IDs for each Date Column -->
    <xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
      <xsl:sort select="Date"/>
      <td>
        <xsl:value-of select="count(key('Data_ID', $currentId)[Date=current()/Date])"/>
      </td>
    </xsl:for-each>
  </tr>
  </xsl:for-each>

ここでの秘訣はID、外部からfor-each変数に保存して、内部にいる間にアクセスできるようにすることですfor-each

おそらくより効率的な代替手段は、ID と日付の両方に 3 番目のキーを定義することです。

<xsl:key name="Data_ID_D" match="Data" use="concat(ID, '|', Date)" />

countこれは式を単純化します

<xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
  <xsl:sort select="Date"/>
  <td>
    <xsl:value-of select="count(key('Data_ID_D', concat($currentId, '|', Date)))"/>
  </td>
</xsl:for-each>
于 2013-07-30T17:48:18.830 に答える