Для начала предоставленный требуемый вывод не является правильно сформированным XML-документом или фрагментом.
Кроме того, в предоставленном исходном XML-документе нет элемента <item name="child2" ...>
.
ТакжеЕсть шесть item
элементов с key='4294967611'
, так что это также не годный критерий для идентификации элемента.
Я думаю, вы хотите это :
<ul>
<li><a href="#">top</a>
<ul>
<li><a href="#">child1</a>
<ul>
<li><a href="#">child2-1</a>
<ul>
<li><a href="#">child3-1</a></li>
<li><a href="#">child3-2</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Если моя догадка верна, вот одно из возможных решений:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pEl" select="//item[@name='child2-1']"/>
<xsl:template match="toc">
<xsl:variable name="pChain" select="$pEl/ancestor-or-self::item"/>
<xsl:apply-templates select="$pChain[1]">
<xsl:with-param name="pChain" select="$pChain"/>
<xsl:with-param name="pEndElementId" select="generate-id($pEl)"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="item">
<xsl:param name="pChain" select="/.."/>
<xsl:param name="pcurPosition" select="1"/>
<xsl:param name="pEndElementId"/>
<ul>
<li><a href="#"><xsl:value-of select="@name"/></a>
<xsl:choose>
<xsl:when test="generate-id() = $pEndElementId">
<ul>
<xsl:apply-templates select="item" mode="leafChildren"/>
</ul>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$pChain[position()=$pcurPosition+1]">
<xsl:with-param name="pChain" select="$pChain"/>
<xsl:with-param name="pcurPosition" select="$pcurPosition +1"/>
<xsl:with-param name="pEndElementId" select="$pEndElementId"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</li>
</ul>
</xsl:template>
<xsl:template match="item" mode="leafChildren">
<li><a href="#"><xsl:value-of select="@name"/></a></li>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к предоставленному XMLdocument :
<toc>
<item name="top" key="4294967296" subkey="1">
<item name="child1" key="4294967611" subkey="">
<item name="child2-1" key="4294967611" subkey="">
<item name="child3-1" key="4294967613" subkey=""/>
<item name="child3-2" key="4294967612" subkey=""/>
</item>
<item name="child2-2" key="4294967611" subkey="">
<item name="d" key="4294974806" subkey=""/>
</item>
<item name="child2-3" key="4294967611" subkey="">
<item name="d" key="4294967661" subkey=""/>
<item name="PI" key="4294967659" subkey=""/>
<item name="q" key="4294967660" subkey=""/>
</item>
<item name="child2-4" key="4294967611" subkey=""/>
<item name="child2-5" key="4294967611" subkey="">
<item name="bb" key="4294967616" subkey=""/>
<item name="bb" key="4294967620" subkey=""/>
<item name="f" key="4294967615" subkey=""/>
</item>
</item>
</item>
</toc>
желаемый результат получен :
<ul>
<li>
<a href="#">top</a>
<ul>
<li>
<a href="#">child1</a>
<ul>
<li>
<a href="#">child2-1</a>
<ul>
<li>
<a href="#">child3-1</a>
</li>
<li>
<a href="#">child3-2</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Если мое предположение о желаемом результате не было хитом, пожалуйста,исправьте свой вопрос и предоставьте правильно сформированный вывод.