XML w C#: Arkusze styli i transformacja
- Kategoria: Programowanie, Tagi: C#, XML, .Net, Person
- Napisane przez: Jerzy Piechowiak
- Liczba odsłon: 2586
W poprzednim wpisie poświęconym serializacji, pisałem o tym jak za pomocą C#, przekształcić instancje określonych obiektów do formatu XML. Dzięki temu, można w łatwy sposób wyeksportować dane z poziomu programu i zapisać je w pliku. Niestety format takich danych, kiepsko nadaje się do prezentacji, dlatego dziś zapoznamy się z arkuszami stylów XML oraz transformacją przy pomocy procesora XSLT, która pozwoli nadać danym zapisanym w pliku XML, nowych i lepszych barw.
Co chcemy osiągnąć?
Celem naszych dzisiejszych manewrów, jest utworzenie pliku HTML, w którym dane zostaną zaprezentowane w postaci tabeli. Plik ten, będzie czymś na kształt raportu i będzie posiadać przyjazną dla użytkownika postać.
Na początku musimy przygotować plik XML z danymi. Można go utworzyć wykonując kolejne kroki z wpisu poświęconego serializacji lub pobierając go z działu download (plik Person.xml).
Następnie, należy przygotować arkusz styli, który opisywać ma nasz docelowy, wymarzony plik HTML. Całość zostanie zwieńczona bardzo krótkim kodem napisanym w C#
Arkusz styli
Arkusz styli przygotowany przeze mnie posiada następującą postać:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="Persons">
<html>
<head>
<title>Osoby</title>
<style>
body{
font-family: verdana;
}
table{
border-collapse:collapse;
border-spacing:0;
font-size:10px;
table-layout:auto;
text-align:left;
}
table th, table td{
border:1px solid #D1D2D3;
padding: 5px;
}
</style>
</head>
<body>
<table>
<thead>
<th>Id</th>
<th>Imię</th>
<th>Nazwisko</th>
<th>Wiek</th>
</thead>
<tbody>
<xsl:for-each select="Person">
<xsl:sort select="PersonId"/>
<tr>
<td>
<xsl:value-of select="PersonId"/>
</td>
<td>
<xsl:value-of select="FirstName"/>
</td>
<td>
<xsl:value-of select="LastName"/>
</td>
<td>
<xsl:value-of select="Age"/>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Choć powyższy listing ma aż 54 linijki, to w gruncie rzeczy kod ten, opiera się głównie o HTML.
Pierwsza linia opisuje typ dokumentu oraz odpowiednie przestrzenie nazw i wygląda właściwie tak samo w każdym dokumencie tego typu.
W drugiej linii wskazujemy na dopasowanie szablonu, czyli miejsce w pliku XML do którego chcemy się zaczepić. Ja wskazałem korzeń główny tego XMLa czyli węzeł Person (korzeń główny można również wskazać używając znaku /).
W liniach od 3 do 31, znajduje się właściwie klasyczny kod HTML. Jak widać, nic nie stoi na przeszkodzie by wzbogacić go na przykład o CSS. Kod zapisany w tych liniach, będzie umieszczony bezpośrednio w dokumencie wynikowym i nie ulegnie już żadnym transformacjom.
Najciekawsza konstrukcja znajduje się w liniach 32-48. Jest to specjalna instrukcja for-each używana w arkuszach styli. W linii 32, rozpoczyna się iteracja po wszystkich węzłach Person z XMLa. Aby zachować porządek, w linii 33, ustawiamy sortowanie tych elementów według węzła PersonId, który znajduję się w każdym elemencie Person.
W liniach 34-47 wyświetlamy konkretny wiersz. To na co warto zwrócić uwagę, to konstrukcja:
<xsl:value-of select="PersonId"/>
Tak zapisany kod, powoduje pobranie dla aktualnie przetwarzanego węzła Person wartości z węzła wskazanego w atrybucie select. Dzięki tej konstrukcji, wypełniamy wszystkie komórki w danym wierszu tabeli.
Po utworzeniu wszystkich wierszy za pomocą pętli for-each, zamykamy wszystkie otwarte elementy i kończymy plik.
Transformacja
Ostatnim krokiem do upragnionego sukcesu jest transformacja. Jeśli posiadamy już plik danych oraz arkusz styli to jest to naprawdę prosta operacja, której kod można zawrzeć w trzech liniach kodu:
XslCompiledTransform oXslCompiledTransform = new XslCompiledTransform();
oXslCompiledTransform.Load("Person.xsl");
oXslCompiledTransform.Transform("Person.xml", "Transform.html");
W pierwszej linii, tworzymy obiekt klasy XslCompiledTransform (procesor XSLT 1.0). W drugiej linii, ładujemy przygotowany przez nas wcześniej arkusz styli. Zwieńczeniem dzieła, jest metoda Transform w linii trzeciej, która w tej wersji przyjmuje ścieżkę do pliku danych XML oraz ścieżkę do pliku wyjściowego HTML.
W ten sposób utworzymy plik wyjściowy bazując na standardowych ustawieniach. Klasa ta, pozwala jednak na znacznie więcej, o czym można się przekonać studiując dokumentację MSDN.
Data ostatniej modyfikacji: 05.06.2011, 17:18.
Komentarze