Ваша текущая проблема заключается в том, что в шаблоне, соответствующем udt:Data
, вы делаете <xsl:for-each select="udt:Data">
, но он будет искать дочерние элементы текущего элемента Data
, который также называется Data
. Вы действительно должны искать братьев и сестер здесь.
В XSLT 1.0 вы можете использовать клавишу для поиска элементов «Уровня 2» на основе первых предыдущих элементов «Уровня 1»
<xsl:key name="level2"
match="udt:Data[udt:Title='Level 2']"
use="preceding-sibling::udt:Data[udt:Title='Level 1'][1]/udt:UserDefinedRowId" />
Затем вы начнете с выбора предметов "Уровень 1"
<xsl:variable name="currentData" select="udt:Data[udt:Title='Level 1']" />
<xsl:apply-templates select="$currentData" mode="list" />
Затем, чтобы получить предметы "Уровень 2" для текущего предмета "Уровень 1", вы можете использоватьключ
<xsl:for-each select="key('level2', udt:UserDefinedRowId)">
Попробуйте это XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:udt="DotNetNuke/UserDefinedTable"
exclude-result-prefixes="udt">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:key name="level2"
match="udt:Data[udt:Title='Level 2']"
use="preceding-sibling::udt:Data[udt:Title='Level 1'][1]/udt:UserDefinedRowId" />
<xsl:template match="udt:Data" mode="list">
<li>
<span>
<xsl:value-of select="udt:Category" />
</span>
<xsl:if test="key('level2', udt:UserDefinedRowId)">
<ul class="levelTwo">
<xsl:for-each select="key('level2', udt:UserDefinedRowId)">
<li>
<span>
<xsl:value-of select="udt:Category" />
</span>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="/udt:UserDefinedTable">
<xsl:variable name="currentData" select="udt:Data[udt:Title='Level 1']" />
<xsl:if test="$currentData">
<ul class="my-list">
<xsl:apply-templates select="$currentData" mode="list" />
</ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что вы должны изменить выражения, такие как Title="Level 1"
, соответственно, если у вас есть лучший способ идентификации элементов уровня 1 и уровня 2.