XML, xsl - рекурсия

Space

Новичок
XML, xsl - рекурсия

XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="___.xsl"?>
<document>
<contents>
<part>
<body>
<list>
<item>
item 1
<item>
item 1.1
</item>
<item>
item 1.2
</item>
</item>
<item>
item 2
</item>
<item>
item 3
</item>
</list>
..........

Как вывести с помощью xsl данные items в html таким образом:

<ul>
<li>item 1
<ul>
<li>item 1.1</li>
<li>item 1.2</li>
</ul>
</li>
<li>item 2</li>
<li>item 3</li>
</ul>

item 1
item 1.1
item 1.2
item 2
item 3

ЗЫ: items может иметь неограниченное число вложений, обрабатывать как рекурсию

===========

Пример "недоделанной" конструкции:
.....
<xsl:template match="list">
<xsl:call-template name="generate_items"/>
</xsl:template>

<xsl:template name="generate_items">
<ul>
<xsl:for-each select="item">
<li><xsl:value-of select="."/><xsl:call-template name="generate_items"/></li>
</xsl:for-each>
</ul>
</xsl:template>
....

За ранее благодарен.
 

slach

Новичок
почитай про xsl:param

тут кстати не обязательна полноценная рекурсия
именно так как ты хочешь может не получиться
но возможно подойдет вот такой вариант

<xsl:apply-templates select="list">
<ul>
<xsl:apply-templates select="item" mode="tree">
</ul>
</xsl:apply-templates>

<xsl:template match="item" mode="tree">
<li><xsl:value-of select="."/>
<ul>
<xsl:apply-templates select="item">
</ul>
</li>
</xsl:template>
 

Space

Новичок
все куда проще:

<xsl:value-of select="."/> заменить на:
<xsl:value-of select="node()"/>

в результате получим:

<xsl:template match="list">
<xsl:call-template name="generate_items"/>
</xsl:template>
<xsl:template name="generate_items">
<ul>
<xsl:for-each select="item">
<li><xsl:value-of select="node()"/><xsl:call-template name="generate_items"/></li>
</xsl:for-each>
</ul>
</xsl:template>
 

Qasimodo

Новичок
for-each и call-template слегка лишние.

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version = '1.0'
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="list">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="item[item]">
<ul>
<li>
<xsl:value-of select="text()"/>
</li>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="text()"/>
</li>
</xsl:template>
</xsl:stylesheet>
 

Space

Новичок
Qasimodo, почему лишнее? а вдруг у меня вложенность item'ов составляет не 2 а больше?
т.е.
<item>
...<item>
......<item>
.........<item>
............... :)
 

chameleon

Новичок
почему лишнее? а вдруг у меня вложенность item'ов составляет не 2 а больше?
потму что XSLT штука очень рекурсивная и сама за тебя все сделает :)..
и кто тебе сказал что item[item] ограничивает вложенность?
 

Space

Новичок
chameleon, ну что я могу ответить? Примером! :)

Итак, рассмотрим мой вариант и вариант предложенный
Qasimodo на примере:

Мой:
http://bigli.ru/online_examples/tpl_Space.xml
Соответственно грузится в качестве XSL:
http://bigli.ru/online_examples/xsl_Space.xsl

Qasimodo:
http://bigli.ru/online_examples/tpl_Qasimodo.xml
Соответственно грузится в качестве XSL:
http://bigli.ru/online_examples/xsl_Qasimodo.xsl

И сравним :)

jian:
http://bigli.ru/online_examples/tpl_jian.xml
XSL:
http://bigli.ru/online_examples/xsl_jian.xsl
 

jian

Guest
Код:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = '1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" method="xml" /> 

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

<xsl:template match="*">
<li>
<xsl:value-of select="text()"/>
<ul><xsl:apply-templates select="*"/></ul>
</li>
</xsl:template>

</xsl:stylesheet>
:)
 

Space

Новичок
:)) тем не менее даже с багом работало

-~{}~ 31.10.04 21:08:

Выше предоставил online-example
 

chameleon

Новичок
Итак, рассмотрим мой вариант и вариант предложенный
Qasimodo на примере:
я его вариант не тестировал, лишь только отметил особенности xslt и то, что идея у него правильная.
вот такой шаблон:
PHP:
<xsl:output method="html"/>
<xsl:template match="list">
 <ul>
  <xsl:apply-templates/>
 </ul>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="text()"/>
</li>
</xsl:template>

<xsl:template match="item[item]">
    <li>
      <xsl:value-of select="text()"/>
      <ul>
    <xsl:apply-templates select="./*"/>
  </ul>
  </li>
</xsl:template>
</xsl:stylesheet>
 

Qasimodo

Новичок
Автор оригинала: Space
chameleon, ну что я могу ответить? Примером! :)

Итак, рассмотрим мой вариант и вариант предложенный
Qasimodo на примере:
И увидим что все неправильные.
Твой визувльно ближе всех к желаемому, по генерит лишний пустой <ul />

Исправленный мой вариант :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version = '1.0'
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="list">
<ul>
<xsl:apply-templates select="item" />
</ul>
</xsl:template>
<xsl:template match="item[item]">
<li>
<xsl:value-of select="text()"/>
</li>
<ul>
<xsl:apply-templates select="item"/>
</ul>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="text()"/>
</li>
</xsl:template>
</xsl:stylesheet>
 

chameleon

Новичок
И увидим что все неправильные.
Твой визувльно ближе всех к желаемому, по генерит лишний пустой <ul />
2 Qasimodo, пардон, но мой правильный :)...и где генерится пустой <ul/>? за основу брал файл http://bigli.ru/online_examples/tpl_Qasimodo.xml
. Чем трансформацию делали? (у меня на xalan, все нормально никаких артефактов)..

<xsl:template match="item[item]">
<li>
<xsl:value-of select="text()"/>
</li>
<ul>
<xsl:apply-templates select="item"/>
</ul>
</xsl:template>
к слову, имхо, не может UL быть братом LI
 

Qasimodo

Новичок
Автор оригинала: chameleon
2 Qasimodo, пардон, но мой правильный :)...
А твоего в том списке нету :)
к нему претензий не имею, поскольку он - исправленая версия моего :)
на первенство исправления не претендую

и где генерится пустой <ul/>? за основу брал файл http://bigli.ru/online_examples/tpl_Qasimodo.xml
. Чем трансформацию делали? (у меня на xalan, все нормально никаких артефактов)..
В варианте Space. libxml2.
xsltproc xsl_Space.xsl tpl_Space.xml
результат: каждый <il> содержит пустой <ul>
PHP:
<?xml version="1.0"?>
    <ul><li>
      item 1
        <ul><li>
        item 1.1
          <ul><li>
          item 1.1.1
          <ul/></li></ul></li><li>
        item 1.2
        <ul/></li></ul></li><li>
      item 2
      <ul/></li><li>
      item 3
      <ul/></li></ul>
к слову, имхо, не может UL быть братом LI
Не совсем понял: вообще , или по условию задачи ?
 
Сверху