Artykuł

lip 25 2010
0

XML w C#: Arkusze styli i transformacja

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.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus