Alkampfer's Place

Thursday, January 18, 2007, 03:24 AM - Programmazione Generale
Purtroppo questi ultimi giorni soffro veramente di mancanza di tempo, di contro sono contento perché sto ritagliando del tempo per vedere nhibernate che sicuramente è un orm di tutto rispetto. Mi spiace solamente di non avere tempo di proseguire il tuttorial su CC.NET come vorrei.

Alk.

Wednesday, December 20, 2006, 04:14 AM - CruiseControl.NET
Per chi fosse interessato, visto che sto spendendo tempo su Cruise Control .NET ho iniziato a mettere nel mio blog su UGI.NET una serie di post sui miei progressi, penso che possano interessare qualcuno, e comunque costituiscono un buon reminder per me quando dovrò fare un'altra istallazione :P.

Tuesday, December 12, 2006, 05:35 AM - XML

In un precedente post ho mostrato come cambiare nome di un nodo in un file xml tramite trasformata xslt, in questo secondo post facciamo un qualche cosa più avanzata. Ho questo file di partenza

<?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>

Quello che voglio è cambiare il nome del nodo mynode in myNewNode, come trasformazione ulteriore voglio cambiare il valore degli attributi subid in modo che riportino anche l'id del nodo padre, in sostanza voglio un risultato del tipo

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

Per fare questo la trasformata XSLT è la seguente

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

<xsl:stylesheet 
version="1.0"
    
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output 
method="xml" omit-xml-declaration="no" indent="yes" encoding="utf-8"  />
        
    <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:template 
match="sn/@subid">
        <xsl:attribute 
name="subid">
            <xsl:value-of 
select="concat(parent::*/parent::*/@id, '-', .)" />
        <
/xsl:attribute>
    <
/xsl:template>
     
<
/xsl:stylesheet>

 

La parte interessante è che prima di tutto ho messo xsl:output con cui indico il tipo di output che mi aspetto, in questo caso è fondamentale per specificare l'ecoding. La trasformazione degli attributi subid è fatta con l'ultima clasusola xsl:template. Il match è pari a sn/@subid che in pratica effettua il match degli attributi subid figli del nodo sn. Quando matcho questo nodo invece di fare la copia semplicemente emetto un nuovo attributo sempre di nome subid con la clausola xsl:attribute il cui valore viene ottenuto semplicemente concatenando il valore stringa dell'attributo id del nodo padre con il valore del nodo attuale separando con un carattere '-'. La cosa da capire è che all'interno della clausola noi ci troviamo nel nodo XPATH corrispondente all'attributo, per cui per prendere l'attributo id del nodo myNode bisogna utilizzare prima un parent::* per salire al nodo sn, un ulteriore parent::* per salire al nodo myNode e poi prendere il nodo id, l'XPATH è quindi parent::*/parent::*/@id.

Alk.



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.

Next