Преобразование "плоского" XML в древовидный.
С помощью этого форум пишется раз-два.
И код в примере "пишем форум" сокращается до минимума.
Исходный XML :
<?xml version="1.0" encoding="windows-1251"?>
<collection>
<item text="test5" id="5" pid="3"/>
<item text="test1" id="1" pid="0"/>
<item text="test2" id="2" pid="0"/>
<item text="test3" id="3" pid="1"/>
<item text="test4" id="4" pid="2"/>
</collection>
Наш XSL :
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="windows-1251"/>
<xsl:param name="topid" select="0"/>
<xsl:template match="collection">
<test>
<xsl:value-of select="."/>
<xsl:apply-templates select="item[@pid=$topid]">
<xsl:with-param name="x" select="1"/>
</xsl:apply-templates>
</test>
</xsl:template>
<xsl:template match="item">
<xsl:param name="x"/>
<item id="{@id}" name="{@text}" pid="{@pid}" depth="{$x}">
<xsl:apply-templates select="//item[@pid=current()/@id]">
<xsl:with-param name="x" select="$x+1"/>
</xsl:apply-templates>
</item>
</xsl:template>
</xsl:stylesheet>
Получаем :
<?xml version="1.0" encoding="windows-1251" ?>
<test>
<item id="1" name="test1" pid="0" depth="1">
<item id="3" name="test3" pid="1" depth="2">
<item id="5" name="test5" pid="3" depth="3" />
</item>
</item>
<item id="2" name="test2" pid="0" depth="1">
<item id="4" name="test4" pid="2" depth="2" />
</item>
</test>
Оставить комментарий