Я борюсь с 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>
Может быть 100 или даже 1000 временных интервалов, это всего лишь небольшой пример. Я могу настроить иерархию 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, который я использую (QXmlQuery Qt), не поддерживает для каждой группы, поэтому я не смог найти способ группировки по времени.
Извините, что так долго, я надеюсь, что кто-то может помочь, по крайней мере, указать мне правильное направление.
Спасибо.