-1

次の XSLT と XML があるとします。

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
                >
  <xsl:template match="/*">
    <html>
      <head>
        <style type="text/css">
          .exceed{background:yellow;}
          table{border-collapse:collapse;
          cellspacing:0px;
          cellpadding:5px;
          width:90%;}
          .total-hours{background-color:#808080;}
          .total-row-text{font-weight:bold;} 
          .report-header{background-color:#C6BD94;}
          /*{background-color:#FFFFBB;

          }*/
          .Report { width: 90%; font-family:Cambria,serif; font-size:14px  }
          .Report th { border: solid 1px }
          .Report td { padding:5px; padding-left:20px; padding-right:20px; border: solid 1px }
          tr{background-color:#FFFFBB;}
        </style>
      </head>

      <body>
        <div class='ReportDescription'>
        </div>
        <div class='ReportDate'>
        </div>
        <table class="Report">
          <tr class="report-header">
            <xsl:for-each select="headers/header">

              <th class="report-Header">
                <xsl:value-of select="title"/>
              </th>
            </xsl:for-each>
          </tr>
          <xsl:apply-templates mode="Gray" select="PreviousDays/Employee[@total]">
          </xsl:apply-templates>
          <xsl:apply-templates mode="normal" select="PreviousDays/Employee[not(@total)]">
          </xsl:apply-templates>
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="PreviousDays/Employee" mode="Gray">       
    <tr class="total-hours">
      <td class="total-row-text">
        <xsl:value-of select="WorkingDate"/>
      </td>
      <td class="total-row-text">
        <xsl:value-of select="@Name"/>
      </td>

      <td class="total-row-text">
        <xsl:value-of select="totalhours"/>
      </td>
      <td class="total-row-text">
        <xsl:value-of select="Description"/>
      </td>
    </tr>

  </xsl:template>
  <xsl:template mode="normal" match="PreviousDays/Employee">

    <tr class="exceed">
      <td>
        <xsl:value-of select="WorkingDate"/>
      </td>
      <td>
        <xsl:value-of select="@Name"/>
      </td>

      <td>
        <xsl:value-of select="HoursOnProject"/>
      </td>         
      <td>
        <xsl:value-of select="Department"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

XML

<root>
  <headers>
    <header><title>Header1</title></header>
    <header><title>Header2</title></header>
    <header><title>Header3</title></header>
    <header><title>Header4</title></header>
  </headers>
  <PreviousDays>
    <Employee  Name="Martin Davis">
      <WorkingDate>9/12/2013</WorkingDate>
      <HoursOnProject>8</HoursOnProject>
      <Description>Description here</Description>
    </Employee>
    <Employee total="true" Name="Martin Davis">
      <WorkingDate>9/12/2013</WorkingDate>
      <HoursOnProject></HoursOnProject>
      <Description>Description here</Description>
      <totalhours>8</totalhours>
    </Employee>
    <Employee Name="Caroline Jackson">
      <WorkingDate>9/15/2013</WorkingDate>
      <HoursOnProject>8.50</HoursOnProject>
      <Description>Description here</Description>
    </Employee>
    <Employee total="true" Name="Caroline Jackson">
      <WorkingDate>9/15/2013</WorkingDate>
      <HoursOnProject></HoursOnProject>
      <Description>Description here</Description>
      <totalhours>10</totalhours>
    </Employee>
  </PreviousDays>
</root>

個々のレコードの合計行が通常の行の直後に表示されるように、データが name 属性と WorkingDate によって並べ替えまたはグループ化されていることを確認するにはどうすればよいですか? for-each または if 型ステートメントを使用しないことが望ましいです。(ただし、これらのタイプのソリューションは大歓迎です。)

望ましい出力

<table class="Report">
      <tr class="report-header">
        <th class="report-Header">Header1</th>
        <th class="report-Header">Header2</th>
        <th class="report-Header">Header3</th>
        <th class="report-Header">Header4</th>
      </tr>
      <tr class="exceed">
        <td>9/12/2013</td>
        <td>Martin Davis</td>
        <td>8</td>
        <td></td>
      </tr>
      <tr class="total-hours">
        <td class="total-row-text">9/12/2013</td>
        <td class="total-row-text">Martin Davis</td>
        <td class="total-row-text">8</td>
        <td class="total-row-text">Description here</td>
      </tr>
      <tr class="exceed">
        <td>9/15/2013</td>
        <td>Caroline Jackson</td>
        <td>8.50</td>
        <td></td>
      </tr>
      <tr class="total-hours">
        <td class="total-row-text">9/15/2013</td>
        <td class="total-row-text">Caroline Jackson</td>
        <td class="total-row-text">10</td>
        <td class="total-row-text">Description here</td>
      </tr>    
    </table>

XSLT 2.0を回避できるのであれば、切り替えたくないことに注意してください。

4

1 に答える 1