Paolo Pialorsi

SOA, Workflow Foundation (WF), Windows Communication Foundation (WCF) e le Architetture Distribuite

News

Archives

XSLT vs LINQ to XML Transformations

In questo periodo sto facendo diversi esperimenti con LINQ to XML. Devo dire che l'idea è interessante e ci sono diversi aspetti curiosi oltre che stimolanti. Per esempio stasera stavo valutando la possibilità di trasformare grafi XML usando codice .NET, tramite LINQ to XML Transformations, anziché XSLT. Lasciando stare i sentimenti :-) ... avete voglia di farmi sapere (via email o con i commenti) quale tra le due seguenti strade preferite per trasformare un documento XML fatto così:

<?xml version="1.0" encoding="utf-8"?>
<customers>
  <customer name="Paolo" city="Brescia" country="Italy" />
  <customer name="Luca" city="Florence" country="Italy" />
  <customer name="Ermes" city="Paris" country="France" />
  <customer name="Franke" city="Munich" country="Germany" />
</customers>

in uno fatto così:

<?xml version="1.0" encoding="utf-8"?>
<c:customers xmlns:c="http://schemas.devleap.com/Customers">
  <c:customer>
    <c:name>Paolo</c:name>
    <c:city>Brescia</c:city>
  </c:customer>
  <c:customer>
    <c:name>Luca</c:name>
    <c:city>Florence</c:city>
  </c:customer>
</c:customers>

La prima strada è usare XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:c="http://schemas.devleap.com/Customers">
<xsl:template match="customers">
  <c:customers>
    <xsl:for-each select="customer[@country = 'Italy']">
      <c:customer>
        <c:name><xsl:value-of select="@name"/></c:name>
        <c:city><xsl:value-of select="@city"/></c:city>
      </c:customer>
    </xsl:for-each>
  </c:customers>
</xsl:template>
</xsl:stylesheet>

La seconda strada è usare LINQ to XML Transformations:

XNamespace ns = "http://schemas.devleap.com/Customers";
XElement destinationXmlCustomers =
  new XElement(ns + "customers",
    new XAttribute(XNamespace.Xmlns + "c", ns),
      from c in sourceXmlCustomers.Elements("customer")
      where c.Attribute("country").Value == "Italy"
      select new XElement(ns + "customer",
        new XElement(ns + "name", c.Attribute("name")),
        new XElement(ns + "city", c.Attribute("city"))));

Io ho una mia idea, però vorrei sentire anche il vostro parere...

Grazie.

Comments

marco.pappalepore said:

Ciao Paolo,

il primo frammento di codice mi sembra più chiaro e leggibile del secondo. Forse perchè contiene solo informazioni strutturali sulla trasformazione, e non anche implementativo-algoritmiche. In effetti, il secondo contiene meno caratteri (ne conto 437 contro 497), però devo leggerli tutti fino in fondo per avere una visione del cuore della struttura che va a produrre, mentre il primo contiene, dopo </c:city>, una sostanziale sequenza di chiusura che si può scorgere e capire con un colpo d'occhio.

Inoltre, se per la trasformazione carico l'xslt da file, una modifica a quest'ultimo non richiederebbe di ricompilare.

Quindi io propenderei per il primo, ovviamente poi tutto va visto alla luce del contesto applicativo...

# febbraio 11, 2007 11:20