IT-Expert
  IT-Expert / Веблог / Рекурсивное построение дерева из "плоского XML"
Авторизация
Логин:
Пароль:


 
Поиск по записям:

Ключевые слова:
Записей в блоге
 за 2023 год
 за 2022 год
 за 2021 год
 за 2015 год
 за 2014 год
 за 2013 год
 за 2012 год
 за 2011 год

     за 2010 год

       за 2009 год
       за 2008 год
       за 2007 год
       за 2006 год
       за 2005 год
      RSS лента Лента новостей IT-Expert 

      Рекурсивное построение дерева из "плоского XML"

      14:58, 24 марта 2005 ( Web Development Parser XSLT  )

      Преобразование "плоского" 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>


      Оставить комментарий
      © Максим Прокопов 2005-2024 О сервере