Дерево меню из XML с применением PHP и XSLT

Помогите пожалуйста. Мне нужно построить дерево меню из XML файла с использованием PHP и XSLT.

Мой код PHP:

    <?php

$text=<<<XML
<categories>
<category id="1" parentId="0"><![CDATA[Программирование]]></category>
<category id="2" parentId="0"><![CDATA[Сайтостроение]]></category>
<category id="5" parentId="1"><![CDATA[C/C++]]></category>
<category id="6" parentId="1"><![CDATA[Delphi]]></category>
<category id="7" parentId="1"><![CDATA[PascalABC]]></category>
<category id="8" parentId="1"><![CDATA[Elena lang]]></category>
<category id="9" parentId="5"><![CDATA[WinAPI]]></category>
<category id="10" parentId="5"><![CDATA[GTK]]></category>
<category id="11" parentId="5"><![CDATA[Qt 5]]></category>
<category id="12" parentId="5"><![CDATA[.Net]]></category>
<category id="13" parentId="6"><![CDATA[WinAPI]]></category>
<category id="14" parentId="6"><![CDATA[.Net]]></category>
<category id="15" parentId="2"><![CDATA[HTML]]></category>
<category id="16" parentId="2"><![CDATA[PHP]]></category>
<category id="17" parentId="2"><![CDATA[Perl]]></category>
<category id="18" parentId="2"><![CDATA[Python]]></category>
<category id="19" parentId="2"><![CDATA[Ruby]]></category>
<category id="20" parentId="2"><![CDATA[Parser 3]]></category>
<category id="21" parentId="2"><![CDATA[Run Basic]]></category>
</categories>
XML;


// Загрузка источника XML
$xml = new DOMDocument;
//$xml->load('myxml.xml');
$xml->loadXML($text);

$xsl = new DOMDocument;
$xsl->load('xslt.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
//$proc->registerPHPFunctions();
$proc->importStyleSheet($xsl); // добавление стилей xsl

echo $proc->transformToXML($xml);

?>

Мой XSLT, который нормально не работает:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" />

<xsl:template match="//category">
  <ul>
    <li>
    <xsl:variable name="id" select="@id"/>

    <xsl:element name="a">
        <xsl:attribute name="href">
            <xsl:value-of select="@id"/>
        </xsl:attribute>
        <xsl:value-of select="."/>
    </xsl:element>   
 
     <xsl:if test="//category[@parentId = $id]">
            <xsl:apply-templates select="//category[@parentId = $id]"/>
     </xsl:if>
     
    </li> 
  </ul>

</xsl:template>

В книгах Дуга Тидуэлла и Сэлла Мангано я ничего не нашел. Кто хорошо соображает в XSLT, помогите пожалуйста решить проблему.

И вторая просьба, помогите пожалуйста поправить функцию, которая строит аналогичное дерево с применением SimpleXML.

Мой код PHP:

    <?php

$text=<<<XML
<categories>
<category id="1" parentId="0"><![CDATA[Программирование]]></category>
<category id="2" parentId="0"><![CDATA[Сайтостроение]]></category>
<category id="5" parentId="1"><![CDATA[C/C++]]></category>
<category id="6" parentId="1"><![CDATA[Delphi]]></category>
<category id="7" parentId="1"><![CDATA[PascalABC]]></category>
<category id="8" parentId="1"><![CDATA[Elena lang]]></category>
<category id="9" parentId="5"><![CDATA[WinAPI]]></category>
<category id="10" parentId="5"><![CDATA[GTK]]></category>
<category id="11" parentId="5"><![CDATA[Qt 5]]></category>
<category id="12" parentId="5"><![CDATA[.Net]]></category>
<category id="13" parentId="6"><![CDATA[WinAPI]]></category>
<category id="14" parentId="6"><![CDATA[.Net]]></category>
<category id="15" parentId="2"><![CDATA[HTML]]></category>
<category id="16" parentId="2"><![CDATA[PHP]]></category>
<category id="17" parentId="2"><![CDATA[Perl]]></category>
<category id="18" parentId="2"><![CDATA[Python]]></category>
<category id="19" parentId="2"><![CDATA[Ruby]]></category>
<category id="20" parentId="2"><![CDATA[Parser 3]]></category>
<category id="21" parentId="2"><![CDATA[Run Basic]]></category>
</categories>
XML;

$xml = new SimpleXMLElement($text);

foreach ($xml->xpath('//category') as $character) {
         if ((string)$character->attributes()->parentId == null) {
                     $par_id = '0'; 
         } else {  
                     $par_id = (string)$character->attributes()->parentId;
         }
         $arr[] = ['id' => (string)$character->attributes()->id, 'pid' => $par_id, 'name' => (string)$character];

}

function html_menu($a,$pid) {

  $menu_html = '<ul>';
  foreach($a as $v)
  {
    if($v['pid']==$pid)
    {
      $menu_html .= '<li><a href="'.$v['id'].'">'.$v['name'].'</a>';
      $menu_html .= html_menu($a,$v['id']);
      $menu_html .= '</li>';
    }
  }
      $menu_html .= '</ul>';
  return $menu_html;
}

$mnu = html_menu($arr,0);
$new_mnu = str_replace("<ul></ul>", "", $mnu);
$new_mnu = str_replace("<li>", "\r\n<li>", $new_mnu);

echo($new_mnu);
?>

Вопрос про XSLT остается открытым!


Ответы (0 шт):