Вот метод, который использует довольно пугающий метод Muenchian Grouping, о котором вы, вероятно, упомянули, если вы посмотрите на другие проблемы XSLT в StackOverflow, поэтому его стоит знать. В этом случае Muenchian Grouping будет использоваться для циклического обхода элементов Timestamp района.
Сначала вы определяете ключ для поиска элементов отметки времени
<xsl:key name="Timestamps" match="Timestamp" use="."/>
Таким образом, если вы используете это для поиска ключа '2004-07-31 16: 00: 00 + 00: 00', он будет содержать две метки времени, но '2004-07-31 17:00 : 00 + 00: 00 'будет содержать только один.
Чтобы циклически проходить по разным элементам Timestamp, вы сначала должны пройти по всем элементам Timestamp, например
<xsl:for-each select="//Timestamp">
Но тогда вам потребуется условие XSL: IF, чтобы проверить, что элемент Timestamp является первым подобным случаем этого значения. Это делается с помощью ключа. Если элемент окажется первым в списке ключей, он может быть обработан.
<xsl:if test="generate-id(.) = generate-id(key('Timestamps',.)[1])">
generate-id - это метод, который нужно использовать, когда вы хотите проверить два одинаковых элемента. В целом это дает:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Timestamps" match="Timestamp" use="."/>
<xsl:template match="/">
<table>
<tr>
<th>Timestamp</th>
<!-- Output the Item headers -->
<xsl:for-each select="//Item">
<th>
<xsl:value-of select="Name"/>
</th>
</xsl:for-each>
</tr>
<!-- Loop through all Timestamps -->
<xsl:for-each select="//Timestamp">
<xsl:sort select="."/>
<!-- Only process the element if it is the first occurence of this value -->
<xsl:if test="generate-id(.) = generate-id(key('Timestamps',.)[1])">
<xsl:variable name="Timestamp" select="."/>
<tr>
<td>
<xsl:value-of select="."/>
</td>
<xsl:for-each select="//Item">
<td>
<!-- Output the relevant Value for the Item -->
<xsl:value-of select="Data/Datum[Timestamp=$Timestamp][1]/Value"/>
</td>
</xsl:for-each>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>