Umbraco XSLT Extensions

I forbindelse med at få omstruktureret Mariba.dk, skal jeg have lavet en masse ny funktionalitet. Til visse visninger har jeg valgt, at lave det via XSLT med mine egne custom made Umbraco XSLT extensions.

Jeg vil her vise, hvordan man opsætter umbraco med sine egne XSLT extensions.

I et Visual Studio projekt (.NET 3,5) laver jeg en klasse og kalder den Cars. Klassen er meget simpel med tre attributter.

 

  1. public class Car
    
  2.     {
    
  3.         public string Brand { get; set; }
    
  4.         public string TopSpeed { get; set; }
    
  5.         public string Color { get; set; }
    
  6.     }
    

 

 

Det er denne struktur, som jeg gerne vil have vist i en oversigt i Umbraco. Jeg vil eks. gerne vise en komplet liste over alle bilerne i eks. min database.

Extensions renderes via en XPathNodeIterator. Derfor skal jeg have lavet en extensionmetode, der tager en liste bestående af alle mine biler, oversætter den til XML og navigerer gennem denne med en XPathNodeIterator.

 

  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Web;
    
  5. using System.Xml.XPath;
    
  6. using System.Text;
    
  7. using System.Xml.Serialization;
    
  8. using System.Xml;
    
  9. namespace Example.Extensions
    
  10. {
    
  11.     public class ExampleExt
    
  12.     {
    
  13.         public static XPathNodeIterator GetCars()
    
  14.         {
    
  15.             List myCars = new List();
    
  16.             Car car1 = new Car();
    
  17.             car1.Brand = "Car 1";
    
  18.             car1.TopSpeed = "Slow";
    
  19.             car1.Color = "Red";
    
  20.             Car car2 = new Car();
    
  21.             car2.Brand = "Car 2";
    
  22.             car2.TopSpeed = "Fast";
    
  23.             car2.Color = "Green";
    
  24.             Car car3 = new Car();
    
  25.             car3.Brand = "Car 3";
    
  26.             car3.TopSpeed = "Very fast";
    
  27.             car3.Color = "Yellow";
    
  28.             myCars.Add(car1);
    
  29.             myCars.Add(car2);
    
  30.             myCars.Add(car3);
    
  31.             return GetXPathNodeIterator(myCars);
    
  32.         }
    
  33.         internal static XPathNodeIterator GetXPathNodeIterator(T t)
    
  34.         {
    
  35.             XmlSerializer reader = new XmlSerializer(typeof(T));
    
  36.             XmlDocument doc = new XmlDocument();
    
  37.            using (System.IO.StringWriter sw = new System.IO.StringWriter())
    
  38.             {
    
  39.                 reader.Serialize(sw, t);
    
  40.                 doc.LoadXml(sw.ToString());
    
  41.             }
    
  42.             return doc.CreateNavigator().Select(".");
    
  43.         }
    
  44.     }
    
  45. }
    

 

Her laver jeg to metoder - en intern metode (GetXPathNodeIterator<T>(T t)), der tager en Generic liste som input parameter og returnerer en XPathNodeIterator baseret på listen. Denne metode fodre jeg med en liste af Car-objekter i min public metoder (GetCars()). Dette er denne public metode, som jeg anvender i en XSLT fil i Umbraco.

Nu er min nye extension klar til at blive lagt over i Umbraco. For at gøre dette, skal man tage assembly'en og lægge over i umbraco's bin bibliotek.

 

Mariba.dk

 

Når dette er gjort, skal man registrere extension'en i Umbraco. Dette gøres i "xsltExtensions.config", som findes i umbraco bibliotektet under "config". I denne fil laver man en ny entry som vist på nedenstående screen dump.

Mariba.dk

 

Når dette er gjort, er man klar til at anvende sin nye extension i umbraco i en XSLT fil. Klik på knappen " insert xsl:value-of".

Mariba.dk

 

Jeg ændre den indsatte "xsl:value-of" metode til en "xsl:copy-of". Denne metode skriver hele det XML dokument, man får fra sin extension, til skærmen. På denne måde kan jeg se, hvad de forskellige elementer og attributter i XML dokumentet hedder, når jeg senere skal referere til dem.

Klik "Get Extension".

Mariba.dk

 

Vælg dine nye metode.

 

Mariba.dk

 

Nu er vores nye extensionmetode sat ind i en XSLT fil. Så nu skal XSLT filen læses fra en template via en macro.

Mariba.dk

 

Nu kan man se sit resultat i Umbraco.

Mariba.dk

 

Man kan så modellere sit data som man vil. Nedenfor er vist en gennemgang af alle objekter af biler via en foreach-statement i XSLT'en.

 

Mariba.dk

 

Og her er det endelige resultat, hvor alle objekterne bliver skrevet ud til skærmen.

Mariba.dk

 

Metoden med at lave sin egen extension til rendering af data fra sin back-end, synes jeg især har sine styrker i forbindelse med visninger uden særlig brugerinteraktion. Derimod finder jeg det nemmere at implementere en ASP.NET UserControl og importere den i Umbraco, hvis man har brugerinteraktion.

3 comments for “Umbraco XSLT Extensions”

  1. Henriksen
    Posted 22. august 2011 at 12:01:47

    Mange tak. Du har lige gjort mit arbejde med Umbraco meget lettere. Hold op hvor er det effektivt, at kunne nøjes med Umbraco XSLT extensions, i steder for at udvikler UserControls til alt.

  2. PP
    Posted 25. august 2011 at 23:02:29

    Tak for eks. Nemt og overskueligt at gå til. Kan aldrig huske alle steps, når jeg skal have lavet custom XSLT extensions til Umbraco. Jeg bookmarker...

  3. Kim Jensen
    Posted 25. oktober 2011 at 22:05:49

    Lige hvad jeg stod og manglende.

Post a comment