Xpoint
   [напомнить пароль]

дерево каталогов

Метки: [без меток]
2009-07-07 07:12:17 [обр] Artem[досье]

Добрый день, здесь уже была подобная тема, но у меня задачка немного сложнее:
xml вида:

<catalog name="one">
  <catalog name="two">
    <catalog name="three"></catalog>
    <catalog name="four"></catalog>
  </catalog>
</catalog>

глубина вложений - произвольная. Хотелось бы получить html вида:

<ul>
<li>one
  <ul>
   <li>two
     <ul>
    <li>three</li>
    <li>four</li>
    </ul></li>
  </ul>
</li>
</ul>

пробовал сделать 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="html"/>
<xsl:template match="/" >
<ul>
<xsl:apply-templates select="//catalog" mode="tree"/>
</ul>
</xsl:template>

<xsl:template match="catalog" mode="tree">

<xsl:choose>

<xsl:when test="not(*)">
   <li><xsl:value-of select="@name" /></li>
   <xsl:if test="not(following-sibling::*)">
   </ul>
   </xsl:if>
   </li>
</xsl:when>

<xsl:otherwise>
</li><xsl:value-of select="@name" /><ul>
</xsl:otherwise>
</xsl:choose>

<xsl:apply-templates select="catalog[@visible=1]" mode="tree"/>
</xsl:template>

</xsl:stylesheet>

естественно такой шаблон не работает, так как не совпадают выводимые тэги. Вопрос: как в этом случае заэкранировать теги списка, или в таком виде шаблон вообще нельзя организовать?

спустя 34 минуты [обр] Lynn «Кофеман»(52/571)[досье]
Зачем же так извращаться? Всё делается проще:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/">
    <ul>
        <xsl:apply-templates select="catalog"/>
    </ul>
</xsl:template>

<xsl:template match="catalog">
    <li>
        <xsl:value-of select="@name"/>
        <xsl:if test="catalog">
            <ul>
                <xsl:apply-templates select="catalog"/>
            </ul>
        </xsl:if>
    </li>
</xsl:template>

</xsl:stylesheet>
спустя 2 минуты [обр] Lynn «Кофеман»(52/571)[досье]
Не нужно пытаться писать на XSLT, как на Си.
спустя 3 часа 20 минут [обр] Artem[досье]

Огромное спасибо!

Не нужно пытаться писать на XSLT, как на Си.

Буду ломать стереотипы :)
Изучаю xslt вторую неделю

спустя 9 дней [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
Lynn «Кофеман»[досье]
На Си только быдлокодеры так напишут, обычно это делается так:
struct tree
{
    struct tree *childs;
    struct tree *next;   /* sibling */
    void        *data;
};

void print_tree (struct tree *node)
{
    for (node = node->childs; node; node = node->next)
    {
        print_tree (child);
        /*
         * Do something with node->data
         */
    }
}
Powered by POEM™ Engine Copyright © 2002-2005