phpbar.de logo

Mailinglisten-Archive

[php] XML-Datei durchgehen, Nodes anhand Parameter löschen

[php] XML-Datei durchgehen, Nodes anhand Parameter löschen

Jens Giessmann jg at handcode.de
Don Dez 28 15:26:02 CET 2006


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