Я видел примеры преобразования "модели смежности" XML, но ни один из них не сделал бы это совершенно правильно для списка маркеров ul / li. Может ли кто-нибудь дать мне подсказку? Было бы здорово, если бы решение могло поддерживать типичные требования модели смежности и иметь дело с многоуровневой вложенностью / рекурсией.
Если XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<row Id="2" Name="data" />
<row Id="3" Name="people" />
<row Id="4" Name="person" ParentId="3" />
<row Id="6" Name="folder" ParentId="2" />
<row Id="7" Name="thing" ParentId="3" />
<row Id="8" Name="web" />
<row Id="9" Name="link" ParentId="8" />
</root>
И я использую что-то вроде:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<ul id="someid" class="menu">
<xsl:apply-templates select="root/row[not(@ParentId)]"/>
</ul>
</xsl:template>
<xsl:template match="row">
<ul>
<li>
<xsl:variable name="ID" select="@Id"/>
<xsl:attribute name="rel">
<xsl:value-of select="@Id"/>
</xsl:attribute>
<xsl:value-of select="@Name"/>
<xsl:apply-templates select="//row[@ParentId=$ID]"/>
</li>
</ul>
</xsl:template>
</xsl:stylesheet>
Тогда я получаю:
<ul id="someid" class="menu">
<ul>
<li rel="2">
data<ul>
<li rel="6">folder</li>
</ul>
</li>
</ul>
<ul>
<li rel="3">
people
<ul>
<li rel="4">person</li>
</ul><ul>
<li rel="7">thing</li>
</ul>
</li>
</ul>
<ul>
<li rel="8">
web<ul>
<li rel="9">link</li>
</ul>
</li>
</ul>
</ul>
Обратите внимание, что дополнительные теги ul / close между open и person не должны быть. Я понимаю, почему это происходит, но не знаю, как изменить код, чтобы исправить это.
Спасибо.