2017-07-14 6 views
-1

を1つのキーを使用して:XSLT:私は形式をとるテーブルグリッドにXMLを変換する必要が相互参照に、第2の鍵

A1,B1,C1 

A2,B2,C2 

A3,B3,C3 

私が働いているXMLは、レコードごとに一つのセルの値を提供していますが、各レコードはDayOfWeek(列)とStream(行)の値を提供します。

ストリーム用とDayOfWeek用の2つのキーを使用して簡単なXSLT変換を行いました。これらは、ストリームごとに1つずつ、週の各曜日に1つずつ、3つの行を持つという点で問題なく機能します。内容はちょうど最初の行が繰り返されているが(すなわち

A1,B1,C1, 
A1,B1,C1, 
A1,B1,C1 

は、どのように私は両方の重要な基準に基づいて、表のセルにDisplayStuffを選択します。ここ

は私のXSLTです:?

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" encoding="us-ascii" /> 
    <xsl:key name="DayOfWeek1" match="DataRow" use="DayOfWeek" /> 
    <xsl:key name="Stream1" match="DataRow" use="Stream" /> 
    <xsl:template match="QueryResults"> 
     <table> 
    <xsl:for-each select="//DataRow[generate-id() = generate-id(key('Stream1',Stream)[1])]"> 
     <tr style="border: 1px solid black;" class="scrolling"> 
      <xsl:for-each select="//DataRow[generate-id() = generate-id(key('DayOfWeek1',DayOfWeek)[1])]"> 


       <td style="border: 1px solid black;" width="100px"> 
        <xsl:value-of select="DisplayStuff" /> 
       </td> 

      </xsl:for-each> 
     </tr> 
    </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

XML :

<?xml version="1.0" encoding="UTF-8"?> 
<QueryResults> 
<DataRow> 
    <Stream>1</Stream> 
    <DayOfWeek>1</DayOfWeek> 
    <DisplayStuff>A1</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>1</Stream> 
    <DayOfWeek>2</DayOfWeek> 
    <DisplayStuff>B1</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>1</Stream> 
    <DayOfWeek>3</DayOfWeek> 
    <DisplayStuff>C1</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>2</Stream> 
    <DayOfWeek>1</DayOfWeek> 
    <DisplayStuff>A2</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>2</Stream> 
    <DayOfWeek>2</DayOfWeek> 
    <DisplayStuff>B2</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>2</Stream> 
    <DayOfWeek>3</DayOfWeek> 
    <DisplayStuff>C2</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>3</Stream> 
    <DayOfWeek>1</DayOfWeek> 
    <DisplayStuff>A3</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>3</Stream> 
    <DayOfWeek>2</DayOfWeek> 
    <DisplayStuff>B3</DisplayStuff> 
</DataRow> 
<DataRow> 
    <Stream>3</Stream> 
    <DayOfWeek>3</DayOfWeek> 
    <DisplayStuff>C3</DisplayStuff> 
</DataRow> 
</QueryResults> 
+0

おそらくこれは単なる貧弱な例ですが、3x3(または3xn)グリッドを扱っていることが分かっている場合、なぜキーが必要なのですか? 3つのレコードのすべてのグループと、そのグループのすべてのレコードのセルの行を作成します。たとえば、https://stackoverflow.com/a/26573496/3016153を参照してください。 –

+0

それが問題です。テーブルは動的です。クリニックは週7日まで稼働することができ、日は連続している必要はありません。最大10のクリニックストリームがあります。 – iainc

+0

それが問題です。テーブルは動的です。クリニックは週7日まで稼働することができ、日は連続している必要はありません。最大10のクリニックストリームがあります。 – iainc

答えて

0

はそれをこの方法を試してみてください

0?これは StreamDayOfWeekの各交点に対して最大1つ DataRowがあるだろうと仮定していること

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="row-by-day" match="DataRow" use="DayOfWeek" /> 
<xsl:key name="row-by-stream" match="DataRow" use="Stream" /> 

<xsl:template match="/QueryResults"> 
    <!-- a column for each distinct day of week --> 
    <xsl:variable name="columns" select="DataRow[generate-id() = generate-id(key('row-by-day', DayOfWeek)[1])]" /> 
    <table border="1"> 
     <!-- a row for each distinct stream --> 
     <xsl:for-each select="DataRow[generate-id() = generate-id(key('row-by-stream', Stream)[1])]"> 
      <xsl:variable name="stream" select="key('row-by-stream', Stream)" /> 
      <tr> 
       <!-- a cell for each column --> 
       <xsl:for-each select="$columns"> 
        <xsl:sort select="DayOfWeek" data-type="number" order="ascending"/> 
        <td> 
         <xsl:value-of select="$stream[DayOfWeek = current()/DayOfWeek]/DisplayStuff" /> 
        </td> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

注意。

関連する問題