Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    10

    [XSLT] Problema con document.write e XSLT

    Salve a tutti, ho un documento xslt che trasforma un foglio xml.
    voglio che gli elementi xml (20in tutto) vengano visualizzati in una tabella 4x5.

    uso il seguente codice:

    Codice PHP:
    <xsl:template match="/">      
    <
    html>    
    <
    head>     
    <
    title>TITOLO</title>
    </
    head>
    <
    body background="images/sfondo.jpg"
    <
    a name="sopra"><h1 align="center" style="color:#FFFF00;font-style:bold; font-size:40px">CAPTION</h1></a>

    <
    table bordercolor="#0000FF" border="4" width="100%"
    <
    tr bgcolor="#FFFF00" align="center"
    <
    xsl:for-each select="PADRE/FIGLIO"
    <
    td align="center">
    <
    xsl:variable name="indirizzo" select="NOME"/>
    [
    url="#{$indirizzo}"]<xsl:value-of select="NOME"/>[/url]
    </
    td><xsl:if test="position() mod 5 = 0">
    <
    script><![CDATA[document.write("</tr><tr>");]]></script>
    </xsl:if>
    </xsl:for-each>
    </tr>
    </table>
    </body> 
    il problema si presenta col document.write, all'esecuzione del tag SCRIPT: firefox mi carica una pagina bianca e sembra continuare a caricare all'infinito. sostituendo il testo del document.write ottengo lo stesso effetto solo che mi compare il testo scritto su sfondo bianco.

    Il fatto è che ho preso la riga col document.write dall'esempio di pagina 27 della guida base all'XSLT e praticamente i codici sono molto simili: in quel caso funziona, nel mio no.

    Leggendo in giro ho letto di problemi tra XML e document.write e si consigliava di usare
    Codice PHP:
    <script><![CDATA[document.getElementById("x").innerHTML="</tr><tr>";]]></script> 
    insieme ad un tag <div id=x></div>, solo che in questo modo non sono riuscito a cavare un ragno dal buco.

    Consigli???

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    10
    Sto provando di tutto, ma non riesco a risolvere questo problema... la prova che sto facendo adesso è questa:

    Codice PHP:
    <table id ="tabella" bordercolor="#0000FF" border="4" width="100%">
    <
    tr bgcolor="#FFFF00" align="center"
    <
    xsl:for-each select="SERIE_A_08-09/SQUADRA"
    <
    td id="{position()}" align="center">
    <
    xsl:variable name="indirizzo2" select="NOME"/>
    [
    url="#{$indirizzo2}"]<xsl:value-of select="NOME"/>[/url]</td>
    </
    xsl:for-each>

    <
    script>
    <![
    CDATA[
    var 
    i;         
    var 
    tot=]]><xsl:value-of select="count(SERIE_A_08-09/SQUADRA)"/>;
    <![
    CDATA[
    for (
    i=1i<=toti++) 
    {
     if ((
    5)==0
      {
         
    document.getElementById(i).innerHTML="</tr><tr>";
       } 
    }
    ]]>
    </script>
    </tr>
    </table> 
    La prima parte serve per creare una tabella di una riga riempiendola con gli elementi del foglio xml, lo script dovrebbe "spezzettarla" creando una nuova riga ogni 5 colonne.

    Il problema è che, visualizzando il codice di quello che ottengo, la trasformazione (o forse è colpa dell'innerhtml) mi sostituisce la sequenza di tag </tr><tr>, che mi dovrebbe creare una nuova riga, con la sequenza <tr></tr> che ovviamente non mi spezzetta la tabella.

    come mai l'innerhtml mi "corregge" il codice???

    sono disperatissimo, per favore datemi una mano.

    P.S. ho notato che il codice così com'è mi elimina la colonna in cui scrivo con l'innerhtml, questo non è un problema... voglio che quella maledetta tabella vada a capo!!!

    Max

  3. #3
    Ciao,
    perchè per costruire le celle prima non esegui una count(nodi) dei nodi che hai in canna?

    Sovente, con le trasformazioni XSLT è auspicabile utilizzare XPath e le sue funzioni,
    che ti assicuro coprono praticamente qualunque necessità.

    Per avere una visuale di tutte le funzioni XPath dai un'occhiata qui .

    Sono articoli che ho scritto io.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    10
    Originariamente inviato da mirkoagrati
    Ciao,
    perchè per costruire le celle prima non esegui una count(nodi) dei nodi che hai in canna?
    Sovente, con le trasformazioni XSLT è auspicabile utilizzare XPath e le sue funzioni,
    che ti assicuro coprono praticamente qualunque necessità.
    Per avere una visuale di tutte le funzioni XPath dai un'occhiata qui .
    Sono articoli che ho scritto io.
    Ciao
    grazie mille per la segnalazione degli articoli, che leggerò volentieri visto che Xpath mi serve comunque... per quanto riguarda il mio problema, ho risolto costruendo dinamicamente la tabella con DOM, visto che il metodo innerhtml non permette di aggiungere tag del tipo TR... ecco il risultato in tutto il suo splendore:

    Codice PHP:
    <table id ="tabella" bordercolor="#0000FF" border="4" width="80%" align="center">
       <
    script>
               var 
    tab document.getElementById("tabella");
               var 
    riga document.createElement("TR");
       
    </script>
       <xsl:for-each select="SERIE_A_08-09/SQUADRA">
       <script>
          <![CDATA[
                  riga.setAttribute("bgcolor","#FFFFFF");
                  riga.setAttribute("align", "center");
                  var colonna = document.createElement("TD");
                  var riferimento = "#]]><xsl:value-of select="NOME"/><![CDATA[";
                  var a1= document.createElement("A");
                  a1.setAttribute("href", riferimento);
                  a1.appendChild(document.createTextNode("]]><xsl:value-of select="NOME"/><![CDATA["));
                  colonna.appendChild(a1);
                  var ind_imag="]]><xsl:value-of select="@STEMMA"/><![CDATA[";
                  var a2=document.createElement("A");
                  var imag =document.createElement("IMG");
                  imag.setAttribute("src", ind_imag);
                  imag.setAttribute("alt", "]]><xsl:value-of select="NOME"/><![CDATA[");
                  a2.setAttribute("href", riferimento);
                  a2.appendChild(imag);
                  colonna.appendChild(document.createElement("BR"));
                  colonna.appendChild(a2);
                  riga.appendChild(colonna);
                  tab.appendChild(riga);
          ]]>
        </script>
        <xsl:if test="position() mod 5 = 0">
            <script>riga = document.createElement("TR");</script>
        </xsl:if>
        </xsl:for-each>
        </table> 
    sicuramente per il momento il codice è un po' sporco, ma almeno funziona ed è quello che mi interessa.

    Max

  5. #5
    Ciao,
    hai ottenuto ciò che volevi!

    Però con XPath avresti scritto meno codice,
    più easy da mantenere oltretutto.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    10
    Originariamente inviato da mirkoagrati
    Ciao,
    hai ottenuto ciò che volevi!

    Però con XPath avresti scritto meno codice,
    più easy da mantenere oltretutto.

    Ciao
    va benissimo, però mi sfugge come potesse l'XPath, essendo dedicato solo ai nodi, risolvere il mio problema che invece riguardava la costruzione dinamica di una tabella in HTML tramite l'XSLT.

    le possibili soluzioni erano, secondo le mie ricerche:

    JAVASCRIPT: il document.write per scrivere i tag </tr><tr>... non funziona perchè il document.write non va d'accordo con l'xml e mi cancellava tutta la pagina.

    innerHTML: per scrivere i due famosi tag all'interno di un div... non funziona perchè, come dichiarato da MS stessa, non permette di gestire alcuni tipi di tag come appunto il TR.

    l'unica soluzione che mi rimaneva era il DOM che, manipolando direttamente l'albero l'HTML, mi ha permesso di creare dinamicamente la tabella proprio come la volevo...

    ti sarei grato se potessi elencarmi altre alternative, anche per mia cultura generale...

    grazie mille per la pazienza e la disponibilità!

    Max

  7. #7
    Ciao,
    eseguendo la count(nodi) avresti potuto sapere quante colonne ti sarebbero servite.
    Poi avresti potuto eseguire dei test su quella risposta.

    ES:
    Codice PHP:
    <xsl:choose>
      <
    xsl:when test="count(./nodo) == 2">
        ............
      </
    xsl:when>

      <
    xsl:when test="count(./nodo) == 3">
        ............
      </
    xsl:when>
      <
    xsl:otherwise>
        ............
      </
    xsl:otherwise>
    </
    xsl:choose
    Il costrutto che ti ho mostrato sopra equivale ad un blocco switch.

    Come ti pare?

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    10
    Originariamente inviato da mirkoagrati
    Ciao,
    eseguendo la count(nodi) avresti potuto sapere quante colonne ti sarebbero servite.
    Poi avresti potuto eseguire dei test su quella risposta.

    ES:
    Codice PHP:
    <xsl:choose>
      <
    xsl:when test="count(./nodo) == 2">
        ............
      </
    xsl:when>

      <
    xsl:when test="count(./nodo) == 3">
        ............
      </
    xsl:when>
      <
    xsl:otherwise>
        ............
      </
    xsl:otherwise>
    </
    xsl:choose
    Il costrutto che ti ho mostrato sopra equivale ad un blocco switch.

    Come ti pare?

    Ciao
    ero a conoscenza dei costrutti da te segnalati, ma forse non ho chiarito per bene il mio problema originario.

    io avevo un tot numero di elementi presenti nel foglio xml (che so a priori, ma che nel caso generale posso recuperare con il count()).

    a questo punto tramite xsl comincio a costruire la mia tabella. se voglio una sola riga il problema non si pone, basta inserire un <td>DATO</td> nell'<xsl:for-each>, con i <tr> all'esterno.

    il problema si pone se voglio per motivi di visualizzazione spezzare la riga suddetta su più colonne, poichè devo aggiungere un </tr><tr> ogni, per esempio, 5 elementi... ovviamente non posso mettere il tag nudo e crudo, perchè il parser mi restituirebbe un errore di xml non ben formato... quindi devo usare un CDATA, immettendo html tramite codice javascript. ma non va bene per i motivi descritti precedentemente. idem per l'innerhtml... l'unica soluzione, per il mio problema, resta il DOM... anche perchè non mi viene in mente nessun altro modo (ed era qui la mia richiesta di prima) per costruire una tabella HTML da codice.

    Max

  9. #9
    Ciao max2m23,
    senza poter vedere il tuo XML,
    a priori e secondo ciò che posso aver dedotto dai tuoi post,
    per prima cosa avrei eseguito la ricerca del blocco di codice con
    maggior numero di celle da disegnare (per esempio 5 <td>),
    e poi avrei impostato fin dall'inizio la creazione di una tabella con 5 colonne per ogni riga,
    eventualmente quelle mancanti le avrei riempite con un &amp;nbsp;

    Mi pare che questo avrebbe potuto risolvere i tuoi problemi.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

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 © 2026 vBulletin Solutions, Inc. All rights reserved.