Я очень плохо знаком с XSL и пытаюсь построить таблицу в следующей структуре:
Я использую этот XML:
<CARS>
<CAR>
<CAR_NUM>65</CAR_NUM>
<DRIVERS>
<DRIVER>
<DRIVER_NUM>123</DRIVER_NUM>
<DRIVER_NAME>STEVE RODGERS</DRIVER_NAME>
</DRIVER>
</DRIVERS>
<STATS>
<STAT>
<LAP>1</LAP>
<TIME>3:21:10</TIME>
</STAT>
<STAT>
<LAP>2</LAP>
<TIME>3:21:07</TIME>
</STAT>
</STATS>
</CAR>
<CAR>
<CAR_NUM>22</CAR_NUM>
<DRIVERS>
<DRIVER>
<DRIVER_NUM>143</DRIVER_NUM>
<DRIVER_NAME>TONY STARK</DRIVER_NAME>
</DRIVER>
<DRIVER>
<DRIVER_NUM>155</DRIVER_NUM>
<DRIVER_NAME>JAMES RHODES</DRIVER_NAME>
</DRIVER>
</DRIVERS>
<STATS>
<STAT>
<LAP>1</LAP>
<TIME>3:22:39</TIME>
</STAT>
<STAT>
<LAP>2</LAP>
<TIME>3:19:17</TIME>
</STAT>
<STAT>
<LAP>3</LAP>
<TIME>3:15:46</TIME>
</STAT>
<STAT>
<LAP>4</LAP>
<TIME>3:17:22</TIME>
</STAT>
</STATS>
</CAR>
</CARS>
Невозможно иметь больше водителей, чем кругов. Вложение таблицы в CAR NUMBER все испортило для меня, потому что я не знаю, как рекурсивно генерировать пустые поля (я предполагаю) с использованием XSL.
Я знаю, что моя первая попытка далеко, но вот она ...
<table>
<xsl:for-each select="CARS/CAR">
<tr>
<td><xsl:value-of select="CAR_NUM"/>
</td>
<xsl:for-each select="DRIVERS/DRIVER">
<td><xsl:value-of select="DRIVER_NUM"/>
</td>
<td><xsl:value-of select="DRIVER_NAME"/>
</td>
</xsl:for-each>
<xsl:for-each select="STATS/STAT">
<td><xsl:value-of select="LAP"/>
</td>
<td><xsl:value-of select="TIME"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
Эта попытка приводит к:
65 123 СТИВ РОДЖЕРС 1 3:21:10 2 3: 21: 07
22 143 Тони Старк 155 Джеймс Роудс 1 3:22:39 2 3:19:17 3 3:15:46 4 3: 17: 22 * 1018 *
Я не могу объяснить, как будут создаваться пустые ячейки и строки при обработке этого цикла.
EDIT:
Исследуя его, я считаю, что мне нужно проанализировать XML как иерархические уровни:
Tier 1: CAR_NUM
Tier 2: DRIVER_NUM, DRIVER_NAME
Tier 3: LAP, TIME
Мне нужно вложить пару если после запуска первой записи:
T1->T2->T3 - End the row, then test for next record in T2 (if found go to T2)
T2->T3 - End the row, then test for next record in T2 (if not found, go T3)
T3