Это классическая проблема группировки.Лучший подход зависит от того, используете ли вы XSLT 2.0 или должны использовать 1.0.
Если 2.0, вы захотите использовать <xsl:for-each-group>
:
<table>
<xsl:for-each-group select="LINE_INFO" group-starting-with="LINE_INFO[ITEM_ID]">
Вышеуказанные выражения XPath для select
и group-starting-with
предполагают, что узел контекста является родителем элементов LINE_INFO.В качестве альтернативы вы можете поместить //
в начале обоих выражений, рискуя снизить производительность.
Вывести строку для каждой группы, с данными, помещенными в ячейки таблицы в соответствии с вашим последним комментарием:
<tr>
<td><xsl:value-of select="current-group()/ITEM_ID" /></td>
<td>
<xsl:value-of "concat(current-group()/DESC, current-group()/EXT_DESC)"/>
<br />
<xsl:value-of "concat(current-group()/LINE_NOTE)" />
<br />
<xsl:value-of "concat(current-group()/NOTE)" />
</td>
<td><xsl:value-of select="current-group()/QTY" /></td>
<td><xsl:value-of select="current-group()/ADDTL_NOTE_DETAIL/NOTE" /></td>
</tr>
</xsl:for-each-group>
</table>
(Остальная часть этого ответа несколько устарела, поскольку у ОП XSLT 2.0.)
Если 1,0, ваша лучшая ставка - мюнхенская группировка .Для шага идентификации групп (шаг 1) вы должны использовать ключ, такой как
<xsl:key name="LINE_INFO-by-section" match="LINE_INFO"
use="generate-id((. | preceding-sibling::LINE_INFO)[ITEM_ID][last()])" />
Для перебора групп:
<xsl:for-each select="LINE_INFO[ITEM_ID]">
<xsl:copy>
Для перебора членовгруппа:
<xsl:variable name="section-starter-id" select="generate-id(.)" />
<xsl:for-each select="key('LINE_INFO-by-section', $section-starter-id))">
<xsl:copy-of select="node()|@*" />
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
(не проверено)