Если вы можете предположить, что каждый Parent
имеет одинаковое количество узлов, вы можете начать с выбора только узлов первого родительского элемента, так как они будут представлять начало каждой новой строки
<xsl:apply-templates select="Parent[1]/Children/Node" mode="row"/>
(здесь используется mode
, поскольку в конечном XSLT будет несколько шаблонов, соответствующих Node
)
Затем для шаблона, соответствующего этим узлам, вы создаете новую строку таблицы и копируете вдочерние узлы от всех родителей, которые находятся в той же позиции в XSLT:
<xsl:template match="Node" mode="row">
<tr>
<xsl:apply-templates select="../../../Parent/Children/Node[position() = current()/position()]" />
</tr>
</xsl:template>
Попробуйте это XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Table">
<table>
<tr>
<xsl:apply-templates select="Parent"/>
</tr>
<xsl:apply-templates select="Parent[1]/Children/Node" mode="row"/>
</table>
</xsl:template>
<xsl:template match="Parent">
<td>
<xsl:value-of select="Head"/>
</td>
</xsl:template>
<xsl:template match="Node" mode="row">
<xsl:variable name="pos" select="position()" />
<tr>
<xsl:apply-templates select="../../../Parent/Children/Node[position() = $pos]" />
</tr>
</xsl:template>
<xsl:template match="Node">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>