Visualizzazione dei risultati da 1 a 9 su 9

Discussione: trasformazione XSL

  1. #1

    trasformazione XSL

    Ciao a tutti!
    Ho un file .xml di questo tipo:
    <SCENA>
    <DISCORSO>
    <CHI>Luca</CHI>
    <LINEA>o chi si vede..</LINEA>
    <LINEA>ciao</LINEA>
    <LINEA>come stai?</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Matteo</CHI>
    <LINEA>io sto bene</LINEA>
    <LINEA>e tu?</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Luca</CHI>
    <LINEA>sto bene anch'io</LINEA>
    <LINEA>grazie</LINEA>
    </DISCORSO>
    .
    .
    .
    .
    .
    </SCENA>

    Vorrei creare una trasformazione xsl che filtra il file ed estrae solo la parte di Matteo, facendola precedere dall'ultima riga del personaggio precedente con l'indicazione di quale personaggio e'.
    Così:

    LUCA
    come stai?
    MATTEO
    io sto bene
    e tu?

    GRAZIE e CIAO

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    106
    il codice si potrebbe anche fare, ma non capisco bene l'utilizzo di un xsl che comunque tira fuori i dati in maniera "forzata" e non dinamicamente, dato che di solito si usa per questo, l'xslt creato poi non sarebbe di certo utile per altre trasformazioni.

    tanto vale farti una pagina html statica, comunque fammis apere cosa ne pensi.

    Cezar

  3. #3
    Hai ragione. Ma visto che sto cercando di imparare a usare xsl, prendo qualche esercizio in rete e cerco di svolgerlo.Ad esempio adesso volevo conoscere meglio l'uso degli Xpath...e cercavo di risolvere il problema che ho proposto. Se hai voglia di propormi la tua maniera di risolverlo, mi farebbe molto piacere.
    Grazie e ciao.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    106
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xslutput method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <html>
    <head>
    <title>Esempio</title>
    </head>
    <body>
    <xsl:value-of select="SCENA/DISCORSO[position()='1']/CHI[position()='1']"/>

    <xsl:value-of select="SCENA/DISCORSO/CHI[position()='1']/../LINEA[position()=last()]"/>

    </br>
    <xsl:value-of select="SCENA/DISCORSO[position()='2']/CHI"/>

    <xsl:value-of select="SCENA/DISCORSO[position()='2']/LINEA[position()=last()]"/>

    </br>

    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>



    Prova, è un esempio molto basilare, spero ti serva, comunque per funzioni avanzate, cerca di usare cicli e condizioni, xsl:for-each, xsl:if etc

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    106
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xslutput method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <html>
    <head>
    <title>Esempio</title>
    </head>
    <body>
    <xsl:value-of select="SCENA/DISCORSO[position()='1']/CHI[position()='1']"/>

    <xsl:value-of select="SCENA/DISCORSO/CHI[position()='1']/../LINEA[position()=last()]"/>

    </br>
    <xsl:value-of select="SCENA/DISCORSO[position()='2']/CHI"/>

    <xsl:value-of select="SCENA/DISCORSO[position()='2']/LINEA[position()=number(last() -1)]"/>

    <xsl:value-of select="SCENA/DISCORSO[position()='2']/LINEA[position()=last()]"/>

    </br>

    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>


    Per la visualizzazione da te richiesta è questo il codice esatto, mi ero diemnticato una riga!!!!!

  6. #6
    Forse mi sono espresso male. Ho un file simile a quello che ho scritto,con un numero tot di DISCORSO.
    Ogni struttura DISCORSO ha un solo campo CHI(che può essere Luca,Matteo,Andrea...) e un numero imprecisato di campi LINEA(può averne 1,2,10...).
    Io devo processare ogni DISCORSO e stampare campo CHI e tutti i LINEA solo dove CHI=Matteo.
    Per ognuno di questo DISCORSO,poi,devo stampare campo CHI e l'ultima LINEA del DISCORSO precedente.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    106
    posta il tuo file esatto di esempio di una decina di righe.

  8. #8
    <SCENA>
    <DISCORSO>
    <CHI>Luca</CHI>
    <LINEA>oh chi si vede..</LINEA>
    <LINEA>ciao</LINEA>
    <LINEA>come stai?</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Matteo</CHI>
    <LINEA>io sto bene</LINEA>
    <LINEA>e tu?</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Luca</CHI>
    <LINEA>sto bene anch'io</LINEA>
    <LINEA>grazie</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Matteo</CHI>
    <LINEA>guarda, sta arrivando Claudio</LINEA>
    <LINEA>ciao Claudio, tutto bene</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Claudio</CHI>
    <LINEA>Ciao ragazzi</LINEA>
    <LINEA>Cosa si fa stasera?</LINEA>
    <LINEA>Io propongo discoteca</LINEA>
    </DISCORSO>

    <DISCORSO>
    <CHI>Matteo</CHI>
    <LINEA>Per me va bene</LINEA>
    <LINEA>Tu cosa ne pensi, Luca?</LINE>
    </DISCORSO>

    <DISCORSO>
    <CHI>Luca</CHI>
    <LINEA>Ci sto anch'io</LINEA>
    </DISCORSO>
    .
    .
    .
    .
    .
    </SCENA>

    Così riesco a stampare solo la parte di Matteo, ma non so come fare a riferirmi al DISCORSO precedente (per poi riuscire anche a stampare CHI e l'ultima LINEA)

    <xsl:template match="SCENA">
    <xsl:apply-templates select="DISCORSO[CHI='Matteo']"/>
    </xsl:template>

    <xsl:template match="CHI">
    <xsl:value-of select="."/>
    <xsl:apply-templates select="LINEA"/>
    </xsl:template>

    <xsl:template match="LINEA">
    <xsl:value-of select="."/>
    </xsl:template>

    Come posso fare?
    Ciao Cezar

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    106
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xslutput method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <html>
    <head>
    <title>Discorsi Matteo</title>
    </head>
    <body>
    <xsl:for-each select="SCENA/DISCORSO">
    <xsl:variable name="discPos" select="position()"/>
    <xsl:for-each select="CHI[.='Matteo']">
    <xsl:variable name="matPos" select="position()"/>


    Chi : <xsl:value-of select="."/>

    <xsl:for-each select="../LINEA">
    <xsl:variable name="linPos" select="position()"/>
    Linea <xsl:value-of select="$linPos"/>: <xsl:value-of select="."/>

    </xsl:for-each>
    </xsl:for-each>

    <xsl:for-each select="//DISCORSO[position()=$discPos -1]/CHI">
    <xsl:variable name="chiPos" select="position"/>
    <xsl:if test=".!='Matteo'">
    RIGA PRECEDENTE
    <xsl:value-of select="."/>

    </xsl:if>
    <xsl:if test=".!='Matteo'">
    Utlima Riga:
    <xsl:value-of select="../LINEA[position()=last()]"/>

    </xsl:if>
    </xsl:for-each>
    </xsl:for-each>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>

    Prova questo, spero di aver capito bene, il file poteva essere più corto, ma il tempo che ho avuto è quello che è e poi se cerchi di capire una file più complesso è tutta esperienza!!

    Cezar

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.