Сам спросил - сам ответил =) Со stackoverflow
XSLT 1.0. Три варианта.
Дважды используется following-sibling, что некрасиво и непроизводительно.
<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]">
<name>
<xsl:value-of select="."/>
<xsl:variable name="rownum" select="@ROWNUM"/>
<xsl:value-of select="./following-sibling::tag[@ROWNUM = $rownum]"/>
</name>
</xsl:for-each>
Используем ключ. И два цикла, что тоже неизящно.
<xsl:key name="num" match="tag" use="@ROWNUM"/>
<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]/@ROWNUM">
<name>
<xsl:for-each select="key('num', .)">
<xsl:value-of select="."/>
</xsl:for-each>
</name>
</xsl:for-each>
Опять используем ключ. Вместо второго цикла используем доступ по индексу.
<xsl:key name="num" match="tag" use="@ROWNUM"/>
<xsl:for-each select="//tag[@ROWNUM = following-sibling::tag/@ROWNUM]/@ROWNUM">
<name>
<xsl:value-of select="key('num', .)[1]"/>
<xsl:value-of select="key('num', .)[2]"/>
</name>
</xsl:for-each>