Кажется, вы просто хотите сгруппировать элементы FirstNode
по дочернему элементу OtherKey
, а затем ссылаться на любые элементы SecondNode
на основе current-group()/UniqueKey
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:key name="second" match="SecondNode" use="FirstNodeKey"/>
<xsl:template match="DataSet">
<xsl:variable name="ds" select="."/>
<xsl:for-each-group select="FirstNode" group-by="OtherKey">
<xsl:copy select="$ds">
<xsl:copy-of select="current-group(), key('second', current-group()/UniqueKey, .)"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Это XSLT 3, работающий с Saxon 9.8 (пример на https://xsltfiddle.liberty -development.net / 3NzcBtw ) или Altova 2018, для XSLT 2 вы можете записать
<xsl:copy select="$ds">
<xsl:copy-of select="current-group(), key('second', current-group()/UniqueKey, .)"/>
</xsl:copy>
а
<DataSet>
<xsl:copy-of select="current-group(), key('second', current-group()/UniqueKey, $ds)"/>
</DataSet>
и, конечно, если есть другие узлы для обработки, замените объявление xsl:mode
шаблоном идентификации.