Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [DOM] Problemi di visite...

    Sto affrontando da qualche giorno il mondo di XML (dopo che sono riuscito a far andare anche XSL grazie alla risposta su questo forum) e sto cercando di utilizzarlo un po' per il mio sito personale.

    Ora. Ho deciso di fare un XML che gestisse il menù delle pagine.
    L'XML è qualcosa del genere:

    codice:
    <?xml version="1.0" encoding="UTF-8"?>    
    <?xml-stylesheet type="text/xsl" href="menu.xsl"?>
    <menu>
      <sezione value="home">
       <voci>
         <riga url="index.php"> Home </riga>
         <riga url="index.php?page=home&amp;sez=news"> News </riga>
         <riga url="index.php?page=home&amp;sez=guest"> Guestbook </riga>
         <riga url="index.php?page=home&amp;sez=varie"> Varie  </riga>
       </voci>
      </sezione>
      <sezione value="uni">
       <voci>
         <riga url="index.php?page=uni&amp;sez=fis"> Fisica </riga>
         <riga url="index.php?page=uni&amp;sez=log"> Logica  </riga>
         <riga url="index.php?page=uni&amp;sez=reti"> Reti di Calcolatori  </riga>
         <riga url="index.php?page=uni&amp;sez=sic"> Sicurezza </riga>
         <riga url="index.php?page=uni&amp;sez=cps"> Statistica </riga>
       </voci>
      </sezione>
    </menu>
    Ora. In base alla pagina nella quale mi trovo, indicata da $_GET['page'], vorrei sottomettere all'XSLT solo il "pezzo" dell'XML riferito alla pagina nella quale mi trovo.
    Dato che la selezione avviene dinamicamente, non credo si possa fare da XSL e quindi devo premunirmi in PHP per differenziare l'XML da dare in pasto all'XSL.

    Ho pensato quindi di usare DOM che mi permette di gestire i file XML come fossero degli alberi. L'idea è quindi quella di "costruire" una XML temporaneo in memoria con solo la parte che mi serve e quindi darla in pasto all'XSL.

    Ho deciso quindi di utilizzare DOM dato che devo leggere da una parte e ricostruire dall'altra.
    Tuttavia mi trovo qualche problema quando devo gestire gli oggetti che vengono fuori perché spesso mi trovo ad avere, per esempio, oggetti di tipo ELEMENTS invece che NODES e quindi le funzioni vanno a fare operazioni sui nodi, non funzionano.

    Ecco un pezzo di codice che ho fatto:
    codice:
      $documento = file_get_contents("xml/menu.xml");
      if (!$menu = domxml_open_mem ($documento)) {
        echo "Error while parsing the document\n";
        exit;
      }
      $nodi =  $menu -> get_elements_by_tagname ("sezione");
      foreach ($nodi as $oggetto)
       if ( ($oggetto->get_attribute("value")) == $_GET['page'])
         break;
    Nel codice sopra, apro ovviamente il file menu.xml e quindi cerco la sezione "sezione" che mi restituisce un vettore di DOMELEMENTS.
    Poi scorro il vettore e cerco quello che ha come attributo, la pagina nella quale mi trovo. Il codice fin qui funziona permettamente. Il ciclo esce e nella variabile oggetto mi trovo il DOMELEMENTS richiesto.

    Il problema viene ora. Io mi sono detto. Bene. Adesso creo la mia nuova versione temporanea del file menu.xml e ci appendo questo nodo che si porta dietro il tocco che mi serve.

    Il codice di creazione del primo pezzo della versione temporanea del file menu è questo:

    codice:
      $new_menu = domxml_new_doc ("1.0");
      $root = $new_menu -> create_element("menu");
      $root = $new_menu->append_child($root);
      //   $sezione = $root->append_child ($oggetto);
      //$new_menu -> dump_file ("test.xml",false, false);
    La prima riga commentata è stato il mio primo tentativo andato purtroppo a vuoto in quanto DOM mi avverte che "oggetto" appartiene ad un altro documento e non posso appenderlo a questo.
    Giusta obiezione, credo, e quindi mi dico. Beh. Mi faccio una copia di "oggetto" e la appendo.
    Vado a vedere le istruzioni di DOM e trovo dump_node
    peccato che quando gli do in pasto "oggetto" mi dice che lui vuole un DOMNODE e non un DOMELEMENTS.
    Però a conti fatti anche sezione è un nodo o forse con nodo si intede quello terminale ovvero le foglie?

    Non demordo e quindi tento di avvalorare l'ipotesi che lui consideri NODO solo le foglie e nel mio caso è riga.

    Quindi mi armo del mio "oggetto" e ci faccio un get_elements_by_tagname dato che non esiste un get_node_by_tagname e non esiste nessuna possibile funzione di conversione (o casting degli oggetti).
    Ecco quindi che ottengo un vettore con le righe. Provo quindi a fare nuovamente un dump ma anche questa volta fallisco perché lui vuole nodi.

    Ora. Come caspita faccio a ottenere dei nodi se non esistono funzioni di conversione e le funzioni di creazioni si limitano a create_elements?!!

    Spero di non avervi tediato troppo ma sinceramente dopo innumerevoli altri tentativi, inizio a essere stanco...

    Grazie e alla prossima...
    .:[Mr.Mime]:.

  2. #2
    Non ho letto l'intero messaggio (troppo lungo a quest'ora), però quando dici
    Dato che la selezione avviene dinamicamente, non credo si possa fare da XSL e quindi devo premunirmi in PHP per differenziare l'XML da dare in pasto all'XSL.
    non sono assolutamente d'accorco con te, io lo farei fare all'XSL quel lavoro.

    Con "pezzo dell'XML riferito alla pagina nella quale mi trovo" penso ti riferisci a <sezione value="">, dunque basterebbe passare il value in questione come variabile XSL e poi nell'XSL prima di mostrare il contenuto di <sezione> fai un test se value corrisponde o meno alla variabile passata.

    Penso che ti risolverebbe molti problemi questa soluzione.

  3. #3
    La variante "fai fare all'XSL" mi è stata consigliata anche ieri sera da un mio amico.
    Tuttavia come faccio a passare una variabile all'XSL?
    Il mio amico proponeva un barbatrucco ovvero mettere in una variabile il fil e XML, aggiungerci un tag "privato" tipo:
    <pagina> XXX </pagina> (dove XXX sarà dinamicamente sostituito da $_GET['page']
    da far utilizzare poi all'XSL come termine di paragone.

    Se però esiste una maniera più "ufficiale" per passare parametri, allora mi fareste un grande favore se potreste dirmelo.
    Forse è la famosa variabile argumens che si passa quando si lancia xslt_process ?

    Grazie e alla prossima...
    .:[Mr.Mime]:.

  4. #4
    Ciao,
    per far comportare il foglio di stile in modo diverso a seconda delle situazioni puoi usare l'array "parameters" che vedi qui
    http://it.php.net/manual/en/function.xslt-process.php

    passi un array associativo

    vedi l'esmpio del manuale

    Example 4. Passing PHP variables to XSL files

    Testi il valore del parametro con xsl:if e in base al suo valore esegui l'operazione
    per favore NIENTE PVT TECNICI da sconosciuti

  5. #5
    Ti ringrazio per l'aiuto.
    Nonostante consulto praticamente ogni 2 secondi php.net, quell'esempio mi era sfuggio.

    Ora sono riuscito a fare andare lo script con il seguente codice. Lo posto nel caso interessi a qualcuno:
    codice:
    <?xml version="1.0" ?>    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
        <xsl:param name="page"/>
        <xsl:template match="/">    
            <table align="center" border="0" cellspacing="0" cellpadding="0" width="95%" heigh="100%">
             <xsl:for-each select="menu/sezione">
             <xsl:if test="@value[.= $page]">
                 <xsl:apply-templates select="voci"/>
             </xsl:if>
             </xsl:for-each>
             </table>
        </xsl:template>
    
        <xsl:template match="voci">
          <xsl:apply-templates select="riga"/>
        </xsl:template>
    
        <xsl:template match="riga"> 
         <tr><td align="center" >
           <a>
           <xsl:attribute name="href">
              <xsl:value-of select="@url"/>
           </xsl:attribute>
           <xsl:value-of select="text()"/>
           </a>
           
    
           </td></tr>
      </xsl:template>
    
    </xsl:stylesheet>
    Prima i chiudere, volevo fare un'altra domanda.
    Nella mia versione, il controllo viene fatto sull'attrivuto value del tag <sezione>.

    Poniamo che io invece avessi, dentro <sezione> un tag di questo tipo:
    <titolo> home </titolo>
    e avessi voluto fare il controllo sul contenuto del tag.
    Ho provato a scrivere

    codice:
      <xsl:if test="titolo = $page">
    oppure

    codice:
    <xsl:if test="titolo[.= $page]">
    Ma non funzionano. Probabilmente devo mettere il contenuto del tag titolo dentro una variabile e fare il confronto con quella, però non so come si fa e nelle guide che ho consultato non ci sono esempi di questo tipo.

    Grazie per l'attenzione e per l'aiuto.

    Ciao e alla prossima...
    .:[Mr.Mime]:.

  6. #6
    Se ho capito cosa vuoi fare (leggere il contenuto del tag titolo) devi usare la funzione text() di xpath.

    Cerca un tutorial su xpath (anche su html.it ce n'è uno) e vedrai che ti sarà facile manipolare l'xml con xslt in maniera chirurgica
    per favore NIENTE PVT TECNICI da sconosciuti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.