Если бы Коперника приняла этот XSLT, это было бы неправильно. XSLT - это XML, и XML должен быть строго иерархическим. Элемент <xsl:if>
не может содержать начальный тег типа <tr>
без соответствующего конечного тега </tr>
в том же элементе <xsl:if>
. Иными словами, таблица стилей XSLT не является потоком произвольной формы начальных и конечных тегов; это поток начальных и конечных тегов, которые выражают древовидную структуру узлов. <a> <b> </a>
не выражает древовидную структуру, даже если у вас есть </b>
позже. Думайте о начале / конце тегов как скобки:
(1 * [2 + 3)]
не грамматически.
@ FailedDev прав, что вы не можете рассматривать XSLT как процедурный язык программирования. Вы не можете предполагать, что элементы будут обработаны в определенном порядке. Вместо того, чтобы думать «мне нужно начинать новую строку каждые три элемента» (процедурную концепцию «один за другим»), вы должны понимать это как «мне нужно сгруппировать элементы в группы по три, причем строка содержит каждая группа. "
Я не могу представить себе лучшую реализацию этого, чем @ FailedDev в XSLT 1.0, поэтому я не буду предлагать ее. В XSLT 2.0 вы можете использовать
<xsl:for-each-group group-starting-with="element[position() mod 3 = 1]">
<tr>
<xsl:apply-templates select="current-group()" />
</tr>
</xsl:for-each-group>
...
<xsl:template match="element">
<!-- your stuff between rows here -->
</xsl:template>