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

    [XSLT]inserire apertura e chiusura div ogni tre record

    sono forzato per motivi di design non dipendenti dalla mia volontà, ad aprire (e chiudere) un certo div solo ogni tre record xml, in modo che venga fuori qualcosa di simile

    <div class="apertura_blocco_di_3">
    <div class="blocco_articolo"></div>
    <div class="blocco_articolo"></div>
    <div class="blocco_articolo"></div>
    </div>

    il mio primo pensiero è stato di mettere un <xsl:if> in questo modo nel foreach

    <xsl:if test="(position() mod 3) = 1">

    <div class="apertura_blocco_di_3">

    </xsl:if>

    <div class="blocco_articolo">

    <xsl:if test="(position() mod 3) = 1">
    </div>
    </xsl:if>

    questo però mi da problemi perchè non è un file xsl ben formato... soluzioni più corrette?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    potresti creare una funzione javascript con la funzione mod.

    <xsl:variable name="tua_variabile">
    <xsl:value-of select="js:tuo_script(position())"
    </xsl:variable>

    poi crearti una variabile e usare l'
    <xsl:if test="$tua_variabile=1">
    tua condizione
    </xsl:if>

  3. #3
    Temo di non aver capito la tua soluzione, ma forse la mai spiegazione non era chiara:
    Il mio problema è che, dovendo mettere un if sull'apertura del div, e uno diverso sulla chiusura dello stesso, mi viene rilevato come xsl non ben formato, perchè apertura e chiusura del div dovrebbero essere nello stesso if.

  4. #4
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    non è chiara perchè vuoi la pappetta pronta:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="JavaScript">
    <xslutput method="html" indent="yes"/>
    <msxsl:script language="JavaScript" implements-prefix="js">
    <![CDATA[
    function calcola_Mod(Value)
    {

    // scrivi qui la funzione che ti restituisce il valore assegnando una variabile
    return (//inserisci la variabile del valore//)

    }



    ]]>
    </msxsl:script>

    durante il ciclo dentro il template:
    crei uan variabile
    <xsl:variable name="tua_variabile">
    <xsl:value-of select="js:calcola_Mod(position())"
    </xsl:variable>

    poi puoi usare l'IF
    <xsl:if test="$tua_variabile=1">
    tua condizione
    </xsl:if>

    spero che sia più chiaro.

  5. #5
    No, scusa, non è più chiaro.
    La mia incomprensione non riguardava il fatto che fosse più o meno esteso l'xsl, ma riguardava l' argomento del problema. Non ho problemi nell' xsl:if, quello va benissimo, è un problema di strutturazione dell'xsl risultante.
    Con il tuo codice non fai altro che creare una variabile, ed utilizzare quella per calcolare il modulo. Quello non è assolutamente un problema, funzionava benissimo senza variabili. Il problema è che, se apro un div all' interno di un xsl:if, e lo chiudo in un altro xsl:if, questo non è xsl ben formato.
    Ad ogni modo, per ora ho risolto buttando fuori l'html come stringa e disabilitando l'escaping, anche se si tratta di una pezza, più che una soluzione. Cercavo una soluzione che fosse coerente con la semantica xsl. Ne avrei trovata una, spulciando in giro, ma mi sembra piuttosto complicata. Ad ogni modo pare che quel blocco non verrà generato, dunque probabilmente non dovrò preoccuparmente.
    Ti ringrazio comunque per la pazienza.

  6. #6
    Utente di HTML.it L'avatar di Polley
    Registrato dal
    Jan 2005
    Messaggi
    696
    io ho capito come farlo, poi guardo nei miei progetti xsl se lo trovo te lo posto

    comunque cosi di primo impatto si può risolvere richiamando dei template

    <xsl:for-each select="div">

    <xsl:choose>
    <xsl:when test="(position() mod 3) = 1">
    <xsl:call-template name="Aggiungi_Div" />
    </xsl:when>
    <xsltherwise>
    <xsl:call-template name="Articolo" />
    </xsltherwise>
    </xsl:choose>

    </xsl:for-each>

    poi fai i due template

    quello per il contenuto dei record dove continuerai a formattare l'articolo

    <xsl:template name="Articolo">
    .................................................. .....
    </xsl:template>

    <xsl:template name="Aggiungi_Div">
    <div>
    <xsl:call-template name="Articolo" />
    </div>
    </xsl:template>

    è più laborioso ma dovrebbe funzionare, sistematelo come vuoi, l'hò fatto al volo
    comunque si può risolvere più in fretta ma intanto puoi utilizzare questo

  7. #7
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    io credo che va in palla perchè in xsl "mod" non esiste

    posso sbagliarmi però...

  8. #8
    mod esiste, io uso questa sintassi e non ho problemi:

    codice:
    <xsl:if test="position() mod 2=1">
    ciao

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.