Проблема в том, что вы не обращаете внимания на встроенные правила , встроенные правила для текстового узла и, в частности, элементов.
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Итак, вам нужнодобавьте это правило полосовых текстовых узлов:
<xsl:template match="text()"/>
И тогда вы получите:
<ul class="searchdata">
<li>
<input id="1" type="checkbox" />
<label for="1">MyTest Descrip</label>
<ul>
<li>
<input id="1" type="checkbox" />
<label for="1">Sub Level - 1</label>
</li>
<li>
<input id="2" type="checkbox" />
<label for="2">Sub Level - 2</label>
</li>
<li>
<input id="3" type="checkbox" />
<label for="3">Sub Level - 3</label>
<ul>
<li>
<input id="4" type="checkbox" />
<label for="4">Sub Level 2 - 1</label>
</li>
<li>
<input id="5" type="checkbox" />
<label for="5">Sub Level 2 - 2</label>
</li>
</ul>
</li>
</ul>
</li>
</ul>
Кроме того, эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="item"/>
<xsl:template match="item[1]">
<ul class="searchdata">
<xsl:apply-templates select="../item" mode="li"/>
</ul>
</xsl:template>
<xsl:template match="item" mode="li">
<li>
<input id="{@id}" type="checkbox"/>
<xsl:apply-templates/>
</li>
</xsl:template>
<xsl:template match="description">
<label for="{../@id}">
<xsl:value-of select="."/>
</label>
</xsl:template>
</xsl:stylesheet>
Примечание : здесь есть правило, соответствующее элементу description
, которое имеет более высокий приоритет, чем встроенное правило шаблона для элементов (применять шаблоны к дочерним узлам).
И, наконец, эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()">
<xsl:apply-templates select="node()[1]|following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="item[1]">
<ul class="searchdata">
<xsl:call-template name="item"/>
</ul>
</xsl:template>
<xsl:template match="item" name="item">
<li>
<input id="{@id}" type="checkbox"/>
<xsl:apply-templates select="node()[1]"/>
</li>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="description">
<label for="{../@id}">
<xsl:value-of select="."/>
</label>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
</xsl:stylesheet>
Примечание : при этом используется последовательное («наиболее мелкозернистый обход») вместо применения рекурсивного шаблона.