Mailinglisten-Archive |
Hi, On Thu, Dec 28, 2006 at 12:04:09AM +0100, Albin Blaschka wrote: > Folgende Ausgangslage: > Ich habe eine XML-Datei, die mir einen Menübaum beschreibt, sie sieht > gekürzt in etwa so aus: [..] > <li acl = "1"><a href = "script1.php">Ausgabe</a> > <ul acl = "1"> > <li acl = "1"><a href = "script2.php">Persönliche Liste</a></li> > <li acl = "2"><a href = "script3.php">Gesamtliste</a></li> > <li acl = "2"><a href = "script4.php">Statistik</a></li> > </ul> > </li> [..] > Wichtig ist hier der Parameter acl, der soetwas wie ein > einfaches Rechte-System umsetzt: der angemeldete User gehört also entweder > Gruppe 1 oder 2 an und entsprechende Menü-Punkte soll er bekommen. So wie du die acl Attribute vergeben hast, wiedersprechen die sich aber. Der li node oben wird ja z.B. nur fuer acl 1 freigegeben, hat aber Kinder der acl 2... Ich gehe mal davon aus, das kommt von "ich habe alles versucht..." ;-) Wie auch immer, hier noch ein ganz anderer Ansatz: Wenn du XML hast, warum machst du die Transformation nicht mit XSL? Dann kannst du dir den ganzen rekursiven Kram und das Dom-Node gebaue in PHP sparen. Hier mal ein Beispiel wie es gehen koennte (mit einem "aufgeraeumten" xml-Source, d.h. ohne acl Att. in den ul Tags, geht aber auch mit) Ergebnis: --------------------------------schnipp----------------------------- <ul id="navigation" class="horizontal"> <li> <a href="edit.php">Daten pflegen</a> <ul> <li> <a href="edit.php?flag=input">Werk eingeben</a> </li> <li> <a href="edit.php?flag=edit">Werk editieren</a> </li> </ul> </li> <li> <a href="script1.php">Ausgabe</a> <ul> <li> <a href="script2.php">Persönliche Liste</a> </li> </ul> </li> </ul> --------------------------------schnapp----------------------------- php-Code mit XML-String --------------------------------schnipp----------------------------- <?php $xml = '<?xml version="1.0" encoding="ISO-8859-1" ?> <ul id="navigation" class="horizontal"> <li acl = "1"><a href = "edit.php">Daten pflegen</a> <ul> <li acl = "1"><a href="edit.php?flag=input">Werk eingeben</a></li> <li acl = "1"><a href="edit.php?flag=edit">Werk editieren</a></li> </ul> </li> <li acl = "2"><a href = "filter.php">Filter</a> <ul> <li acl = "2"><a href = "filter.php?flag=set">Filtern</a></li> <li acl="2"><a href ="filter.php?flag=del">Filter löschen</a></li> </ul> </li> <li acl = "1"><a href = "script1.php">Ausgabe</a> <ul> <li acl = "1"><a href = "script2.php">Persönliche Liste</a></li> <li acl = "2"><a href = "script3.php">Gesamtliste</a></li> <li acl = "2"><a href = "script4.php">Statistik</a></li> </ul> </li> </ul> '; // Parameter-Wert der im XSL-Template fuer die ACL-Preufung verwendet // wird. $acl = 1; // XML-Source initialisieren $xmlDom = new DOMDocument(); $xmlDom->loadXML($xml); // laden des XSLT Stylesheet als DOM $xslDom = new DOMDocument(); $xslDom->load('trash.xsl'); // XSLT processor initialisieren $xsl = new XsltProcessor; // stylesheet importieren $xsl->importStylesheet($xslDom); // ACL-Wert aus $acl im XSL-Template setzen $xsl->setParameter('', 'acl', $acl); // Transformation ausfuehren -> return XML $out = $xsl->transformToXML($xmlDom); print_r($out); ?> --------------------------------schnapp----------------------------- Und hier das passende XSL-Template dazu (trash.xsl): --------------------------------schnipp----------------------------- <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" media-type="text/xml" /> <!-- der ACL Parameter der "aussen" gesetzt wird --> <xsl:param name="acl" select="'X'"/> <!-- aufraeumen --> <xsl:strip-space elements="*" /> <!-- Alle ul Tags die ein passendes acl oder kein acl haben --> <xsl:template match="ul[@acl=$acl]|ul[not(@acl)]"> <ul> <!-- id Attribute uebernehmen --> <xsl:if test="@id"> <xsl:attribute name="id"> <xsl:value-of select="@id"/> </xsl:attribute> </xsl:if> <!-- class Attribute uebernehmen --> <xsl:if test="@class"> <xsl:attribute name="class"> <xsl:value-of select="@class"/> </xsl:attribute> </xsl:if> <xsl:apply-templates /> </ul> </xsl:template> <!-- alle li Tags die ein passendes acl haben --> <xsl:template match="li[@acl=$acl]"> <li> <xsl:apply-templates /> </li> </xsl:template> <!-- Die Links in den li Tags --> <xsl:template match="a"> <a> <xsl:attribute name="href"> <xsl:value-of select="@href"/> </xsl:attribute> <xsl:value-of select="."/> </a> </xsl:template> <!-- Nicht loeschen !!! Das ist der Default fuer "nix machen" wenn sonst kein Template past! --> <xsl:template match="*"> </xsl:template> </xsl:stylesheet> --------------------------------schnapp----------------------------- Gruss Jens
php::bar PHP Wiki - Listenarchive