Alkampfer's Place

Monday, December 11, 2006, 06:01 AM ( 13 views ) - XML

Premetto che non sono un mostro di xslt, lo ho fino ad ora utilizzato per passare da XML a html, file excel etc etc, ma non lo avevo mai utilizzato per trasformare un file XML

Dopo avere perso 10 min facendo alcune prove che non mi hanno portato da nessuna parte ho ripreso in mano uno dei vari libri di XML/XSLT e mi sono detto, meglio ristudiare un poco.

Il fatto è che se si vuole trasformare un xml ad esempio cambiando il nome di un nodo si ragiona in un modo un po differente rispetto a come si farebbe per trasformare in un file HTML. Iniziamo quindi con un semplice problema, ho questo file xml

<?xml version="1.0" encoding="utf-8"?>
<root>
    <mynode 
id="1">
        <sn 
subid="1" />
        <sn 
subid="2" />
        <sn 
subid="3" />
    <
/mynode>
    <mynode 
id="2">
        <sn 
subid="1" />
        <sn 
subid="2" />
    <
/mynode>
<
/root>

Voglio semplicemente cambiare il nome di un nodo, ad esempio tutti i nodi mynode debbono cambiare nome e diventare myNewNode. Partiamo inizialmente da un XSLT che reputo "base" che non fa altro che copiare tutto il file senza modificazioni, da questo si può partire.

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet 
version="1.0"
    
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template 
match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates 
select="@*|node()" />
        <
/xsl:copy>
    <
/xsl:template>
    
<
/xsl:stylesheet>

Come si può vedere la stylesheet è veramente banale, si effettua un match di qualsiasi attributo o nodo e si utilizza la xsl:copy che non fa altro che copiare nell'output il valore del nodo corrente. Internamente riutilizziamo un apply-template che matcha tutto il contenuto ed il gioco è fatto. Da quì possiamo implementare la nostra stylesheet per cambiare il nome di un nodo.

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet 
version="1.0"
    
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template 
match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates 
select="@*|node()" />
        <
/xsl:copy>
    <
/xsl:template>
    
    <xsl:template 
match="mynode">
        <myNewNode>
            <xsl:apply-templates 
select="@*|node()" />
        <
/myNewNode>
    <
/xsl:template>
    
<
/xsl:stylesheet>

Come potete vedere abbiamo solamente aggiunto una regola per effettuare un match dei nodi di nome mynode, questa volta non si utilizza l'istruzione xsl:copy, ma invece si cambia il nome del nodo.

Questo semplice esempio è un buon punto di partenza per capire come modificare file XML tramite XSLT, spero che vi sia piaciuto.

Alk.



Monday, December 11, 2006, 05:41 AM - Programmazione Generale
Negli ultimi due fine settimana mi sono dilettato con il windows media encoder, il risultato è che mi ci sono appassionato e quindi spero di fare uscire con regolarità in dotnetmarche alcuni webcast dedicati alle performance in ambiente .NET.

Ho iniziato parlando della gestione delle stringhe e del CLR profiler, spero che il materiale possa piacervi.

Continuate a controllare il sito di dotnetmarche, molto presto verranno pubblicati i link.

Alk.

Monday, December 4, 2006, 01:14 PM - .NET

Le buone pratiche di programmazione consigliano di inserire delle asserzioni nelle proprie classi, ma cosa succede quando poi testiamo il nostro codice con NUNIT? Il problema è che al fallimento di una asserzione il test mostra la classica messagebox di avvertimento e purtroppo l'esecuzione si ferma fino a che l'utente non interviene premendo un bottone.

La soluzione a questo problema è disabilitare i trace listener standard nel web.config del progetto NUNIT.

    <system.diagnostics>
         <trace autoflush="false" indentsize="4">
             <listeners>
                 <clear/>
             </listeners>
         </trace>
     </system.diagnostics>

In questo modo al fallimento di una asserzione i vostri test non si interromperanno. Se volete comunque vedere le asserzioni fallite è possibile utilizzare l'oggetto standard ConsoleTraceListener in questo modo.

      Private Shared Listener As ConsoleTraceListener = New ConsoleTraceListener()

   <SetUp()> 
Public Sub Init()
      
If (Not Trace.Listeners.Contains(Listener)) Then
         
Trace.Listeners.Add(Listener)
      
End If
   End Sub

In questo modo tutti i messaggi di trace standard del .NET, che comprendono anche i messaggi generati dal fallimento delle asserzioni standard, verranno ridirezionati nella console e sono quindi visibili nella GUI del nunit.

Purtroppo per ragioni a me sconosciute se si inserisce il ConsoleTraceListener dal web.config e non in maniera programmatica non funziona, mah....

Alk.



Thursday, November 30, 2006, 02:17 AM - Varie
La virtualizzazione è un argomento che in questi ultimi anni sta prendendo molto piede, soprattutto con prodotti freeware. Ho provato per un po il microsoft Virtual server R2 e debbo dire che è molto interessante, ma ieri ho istallato il vmware server e debbo dire che come prima impressione mi appare discretamente più veloce del prodotto microsoft, appena ho tempo di stressarlo un po vi terrò aggiornati con ulteriori commenti.

Alk.

Tuesday, November 28, 2006, 02:45 AM - General
Il vecchio theme del blog era indubbiamente carino ma a mio avviso poco leggibile. Soprattutto per chi come me ha 17 pollici LCD da 1280x1024 leggere un sito con caratteri piccoli diventa fastidioso e può indubbiamente limitare la leggibilità.

Inoltre per blog principalmente tecnici quello che veramente è importante non è il layout o l'aspetto grafico ma il contenuto, penso che questo stile sia leggero e leggibile e non mi dispiace.

Prossimamente se ho tempo vedrò magari di mettere mano al css per capire se si può comunque formattare meglio il menu a sinistra che comunque mi pare troppo scarno.

Attendo commenti.

Alk.

Back Next