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

    Inserire automaticamente un attributo in un file XML

    Salve a tutti,

    supponiamo che abbia questo tipo di codice

    codice:
    <pippo>rosso</pippo>
    <paperino>bianco</paperino>
    <topolino>giallo</topolino>
    Vorrei arrivare a questo risultato, tramite uno script:

    codice:
    <pippo id='1'>rosso</pippo>
    <paperino id='2'>bianco</paperino>
    <topolino id='3'>giallo</topolino>
    Praticamente vorrei aggiungere un attributo ad ogni nodo con un indice progressivo.
    Come posso fare?

  2. #2
    Utente di HTML.it L'avatar di ZaK78
    Registrato dal
    Dec 2000
    Messaggi
    35
    Ciao,
    presupponendo tu voglia usare xslt per la trasformazione.
    Per iniziare devi inserire tutti i tuoi elementi in un elemento padre altrimenti il tuo xml non è standard.
    Per esempio inserisci i tuoi elementi dentro l'elemento padre totale

    codice:
    <totale>
            <pippo>rosso</pippo>
            <paperino>bianco</paperino>
            <topolino>giallo</topolino>
    </totale>

    successivamente copia il seguente foglio di stile in un nuovo file, che per esempio puoi chiamare: "file.xsl"

    codice:
    <xsl:transform version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
       <xsl:template match="/">
            <xsl:element name="totale">
            <xsl:apply-templates/>
            </xsl:element>
       </xsl:template>
    
       <xsl:template match="totale/">
            <xsl:copy select="totale">
            <xsl:attribute name="id"><xsl:number value="number(position() div 2)"/></xsl:attribute>
            </xsl:copy>
       </xsl:template>
    </xsl:transform>
    Infine utilizza un processore xsl per associare i due file.
    Io utilizzo xsltproc su linux (in ogni caso c'è il porting anche per windows a questo indirizzo: http://www.zlatkovic.com/libxml.en.html

    ammesso che i nomi dei file siano:
    file.xml (per il tuo xml)
    file.xsl (per il tuo foglio di stile)

    digita su una shell (su windows penso sia la stessa procedura in una finestra dos, comunque leggi la pagina al link sopra ci saranno tutte le informazioni)

    codice:
    xsltproc file.xsl file.xml
    ti ritroverai un output come questo:

    codice:
    <?xml version="1.0"?>
       <totale>
          <pippo id="1"/>
          <paperino id="2"/>
          <topolino id="3"/>
       </totale>
    che era quello che volevi

    Saluti
    Rosario

  3. #3
    Sei stato gentilissimo e chiaro!

    Proverò immediatamente quello che mi hai suggerito.
    Non avrei immaginato di utilizzare XSL per fare una cosa del genere.
    Ti terrò aggiornato sulla situazione.

  4. #4
    Quale binario devo scaricare?
    http://www.zlatkovic.com/pub/libxml/

    Altra domanda...Il codice XSL che mi hai passato applica un ID ad ogni nodo senza nessuna condizione?

  5. #5
    Ho scaricato libxslt-1.1.23+.win32.zip e configurato la variabile d'ambiente...
    provo a lanciare l'eseguibile e....


  6. #6
    Utente di HTML.it L'avatar di ZaK78
    Registrato dal
    Dec 2000
    Messaggi
    35
    Ciao,
    scusa se non ho risposto prima ma ultimamente sono impegnatissimo.

    Per il tuo problema sempre a quel link trovi la libreria iconv, dentro al pacchetto trovi la iconv.dll copiala nella cartella andrea (dove hai xsltproc) e riprova a lanciarlo, se ti richiede qualche altra libreria, cerca sempre a quel link qualche altro pacchetto con il nome della libreria che ti manca.
    Purtroppo non utilizzo tanto windows, specie per lo sviluppo quindi non so darti indicazioni precise.

    Per quanto riguarda il codice che ti avevo postato, manca una copy:
    devi modificareil codice del file.xsl in modo che appaia così:

    codice:
    <xsl:transform version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
            <xsl:element name="totale">
            <xsl:apply-templates/>
            </xsl:element>
        </xsl:template>
    
        <xsl:template match="totale/">
    
            <xsl:copy select="totale">
                <xsl:attribute name="id"><xsl:number value="number(position() div 2)"/></xsl:attribute>
                <xsl:value-of select="text()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:transform>
    avevo dimenticato di inserire la copia dei valori degli elementi
    <xsl:value-of select="text()"/>

    senza quello ti copia ogni elemento, aggiunge un attributo, ma non ti crea il contenuto all'interno.
    Una svista notturna eheh

    Saluti
    Rosario

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.