Рассмотрим следующий пример:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="start-id"/>
<xsl:key name="elem" match="element" use="id"/>
<xsl:template match="/root">
<root>
<xsl:apply-templates select="key('elem', $start-id)"/>
</root>
</xsl:template>
<xsl:template match="element">
<element id="{id}"/>
<xsl:apply-templates select="key('elem', parentId)"/>
</xsl:template>
</xsl:stylesheet>
Применение этого к вашему XML-вводу со значением параметра start-id
6
будетпроизводить:
Результат
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element id="6"/>
<element id="5"/>
<element id="2"/>
<element id="1"/>
</root>
Чтобы исключить начальный узел и перечислить только его предков, вы можете сделать:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="start-id" select="6"/>
<xsl:key name="elem" match="element" use="id"/>
<xsl:template match="/root">
<root>
<xsl:apply-templates select="key('elem', key('elem', $start-id)/parentId)"/>
</root>
</xsl:template>
<xsl:template match="element">
<element id="{id}"/>
<xsl:apply-templates select="key('elem', parentId)"/>
</xsl:template>
</xsl:stylesheet>