XSLTに苦労しています。私は手続き型の土地で立ち往生しています。基本的に、次のようなデータベースから生成される XML があります。
<?xml version="1.0" encoding="iso-8859-1"?>
<report>
<generated_dtm>2013-03-08T18:57:26+00:00</generated_dtm>
<range>
<start_dtm>2013-02-21T17:52:00+00:00</start_dtm>
<end_dtm>2013-03-08T17:52:00+00:00</end_dtm>
</range>
<sensor site_code="A0001" unit_no="1" sensor_no="1">
<name>Food</name>
<mu_symbol>°C</mu_symbol>
</sensor>
<sensor site_code="A0001" unit_no="1" sensor_no="2">
<name>Air</name>
<mu_symbol>°C</mu_symbol>
</sensor>
<readings>
<slot slot_dtm="2013-02-21T17:50:00+00:00">
<sensor sensor_no="1">
<v>10</v>
<status_code>IR</status_code>
<status_desc>In Range</status_desc>
</sensor>
<sensor sensor_no="2">
<v>20</v>
<status_code>Lo</status_code>
<status_desc>Low</status_desc>
</sensor>
</slot>
<slot slot_dtm="2013-02-21T18:00:00+00:00">
<sensor sensor_no="2">
<v>21</v>
<status_code>Lo</status_code>
<status_desc>Low</status_desc>
</sensor>
<sensor sensor_no="1">
<v>11</v>
<status_code>IR</status_code>
<status_desc>In Range</status_desc>
</sensor>
</slot>
</readings>
</report>
私は、各センサーが列であり、各行が次のように左側にある時間で、HTMLテーブルの測定値で終わろうとしています:
Time | Food | Air
-------------------------------------
2013-02-21T17:50:00+00:00 | 10 | 11
2013-02-21T18:00:00+00:00 | 20 | 22
タイムスロットの順序は昇順であることが保証されているため、並べ替える必要はありませんが (1000 の可能性があります)、問題は、各タイムスロット内でセンサーの順序を保証できないことです。テーブル ヘッダーの作成に使用したセンサーを毎回ループし、スロットを反復処理するときに各スロットから正しいセンサーを選択します。これは機能しませんが、おそらく私がやろうとしたことを得るでしょう(なぜ機能しないのかがわかりました..変数は私が期待したように動作しません!): -
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="report">
<html>
<head>
<title>Report</title>
</head>
<body>
<table border="0" width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="2">
<tr>
<td class="column_head_above" width="70">Time</td>
<xsl:for-each select="sensor">
<td class="column_head_above"><xsl:value-of select="name"/><xsl:text> </xsl:text><xsl:value-of select="mu_symbol"/></td>
</xsl:for-each>
</tr>
<!-- go through each time slot -->
<xsl:for-each select="readings/slot">
<tr>
<xsl:variable name="sdtm" select="@slot_dtm" />
<td class="table_data"><xsl:value-of select="$sdtm"/></td>
<!-- go through each sensor header -->
<xsl:for-each select="../sensor">
<xsl:variable name="sno" select="@sensor_no" />
<td>
<xsl:value-of select="../readings/slot[@slot_dtm=$sdtm]/sensor[@sensor_no=$sno]/v"/>
<xsl:value-of select="../readings/slot[@slot_dtm=$sdtm]/sensor[@sensor_no=$sno]/status_desc"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
<!-- end: go through each time slot -->
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
数百または数千ものタイムスロットが存在する可能性がありますが、これはほんの一例です。XML の階層を調整することもできますが、データベース クエリを大幅に修正しない限り、各タイム スロット内にセンサーを配置することはできません。それが必要ないことを願っています。
もともと、スロットが次のように区切られた XML がありました。
<readings>
<slot slot_dtm="2013-02-21T17:50:00+00:00">
<sensor sensor_no="1">
<v>10</v>
<status_code>IR</status_code>
<status_desc>In Range</status_desc>
</sensor>
</slot>
<slot slot_dtm="2013-02-21T17:50:00+00:00">
<sensor sensor_no="2">
<v>20</v>
<status_code>Lo</status_code>
<status_desc>Low</status_desc>
</sensor>
</slot>
<slot slot_dtm="2013-02-21T18:00:00+00:00">
<sensor sensor_no="1">
<v>11</v>
<status_code>IR</status_code>
<status_desc>In Range</status_desc>
</sensor>
</slot>
<slot slot_dtm="2013-02-21T18:00:00+00:00">
<sensor sensor_no="2">
<v>21</v>
<status_code>Lo</status_code>
<status_desc>Low</status_desc>
</sensor>
</slot>
</readings>
これには、はるかに単純なデータベースクエリが含まれていました! ここでは順序を保証できますが、使用している XQuery プロセッサ (Qt の QXmlQuery) は for-each-group をサポートしていないため、時間に基づいてグループ化する方法を見つけることができませんでした。
申し訳ありませんが、これはとても長いです。誰かが少なくとも私を正しい方向に向けるのを手伝ってくれることを願っています.
ありがとう。