V jisté diskuzi jsem narazil na dotaz, zda je možné transformovat data uložená v databázi pomocí XSL. To sice přímo možné není, ale platforma .NET je tak silně spjata s XML, že není velký problém toto zařídit.

Nejdříve se na problém podíváme teoreticky. XSL převádí XML data do formátu přesně podle šablony. Pokud tedy chceme aplikovat XSL na data z databáze, musíme získaná data převést do formátu splňující požadavky specifikace XML. V tomto článku nastíním dva možné postupy – netvrdím, že jediné možné.

Transformace MS SQL výstupu

Podívejme se na první možnost. Nejdříve načteme data z databáze:

string mySelectQuery = „SELECT * FROM Users FOR XML AUTO, ELEMENTS“;
string myConnectString = „server=localhost;database=testing;uid=aaa;pwd=bbb“;
SqlConnection sqlConn = new SqlConnection( myConnectString );
sqlConn.Open();
SqlCommand sqlComm = new SqlCommand(mySelectQuery , sqlConn);
XmlTextReader reader = (XmlTextReader)sqlComm.ExecuteXmlReader();
XPathDocument doc = new XPathDocument(reader, XmlSpace.Preserve);
XslTransform xsl = new XslTransform();
xsl.Load(Server.MapPath(„Users.xslt“)); xsl.Transform(doc, null, Response.OutputStream);

Uvedený kód není nikterak těžký na pochopení. Na prvním řádku specifikujeme SQL dotaz, který nám data vrátí ve formátu XML. Pokud bychom vynechali klíčové slovo ELEMENTS, byla by data vrácena v podobě atributů jednoho uzlu, zatímco takto je každý sloupec reprezentován jedním uzlem. Dále definujeme připojovací řetězec. Následuje samotné připojení k databázi, které nepotřebuje hlubší vysvětlení. Zajímavá pro nás bude až pasáž od osmého řádku, kde specifikujeme XmlTextReader, kterým naplníme XPathDocument. A nakonec už jen data transformujeme pomocí dostupné šablony.

Transformace libovolného databázového výstupu

V předchozím kódu jsme si ukázali, jak transformovat data uložená v MS SQL databázi pomocí XSL šablony. Náš postup byl velice jednoduchý, nicméně trošku omezující. Stejný postup je těžko použitelný na všechny databázové stroje. Pokusíme se tedy využít univerzálnost .NET Frameworku co nejvíce a upravit uvedený kód tak, aby byl využitelný i pro jiné datové sklady.

Co musíme udělat nejdříve, je připojení k databázi. Data, která získáme, následně uložíme do objektu typu DataSet. Tento objekt si svá data interně uchovává v XML, což nám jedině prospěje. Především však třída DataSet vystavuje metodu DataSet.GetXml(), která nám vrátí string, jehož obsahem jsou data v XML podobě, což je přesně to, co potřebujeme.

Výhodou oproti předchozímu postupu je fakt, že DataSet můžeme naplnit prakticky z libovolného zdroje, což nám dává do rukou téměř neomezené možnosti a univerzalitu. Jakmile máme string s daty v XML, stačí použít objekt XmlTextReader společně s instancí StringReaderu a z našeho stringu vytvoříme XmlDocument, který potom jednoduše transformujeme libovolnou šablonou XSL.

Ukázkový kód:

SqlDataAdapter adapter = new SqlDataAdapter(„SELECT * FROM Users“, „server=localhost;database=testing;uid=aaa;pwd=bbb“);
DataSet ds = new DataSet(„UserList“);
adapter.Fill(ds, „Users“);
string dsxml = ds.GetXml();
XslTransform xsl = new XslTransform();
xsl.Load(Server.MapPath(„sablona.xslt“));
XmlTextReader reader = new XmlTextReader(new StringReader(dsxml));
XmlDocument xdoc = new XmlDocument();
xdoc.Load(reader);
xsl.Transform(xdoc, null, Response.OutputStream);

Prvních pár řádků bych ponechal bez komentáře, jsou notoricky známé snad už každému. Jen bych upozornil, že pokud používáte místo MS SQL databázi MS Access, stačí pouze přepsat prefixy Sql na OleDb (SqlDataAdapter na OleDbDataAdapter).

Dále v kódu si deklarujeme řetězcovou proměnnou dsxml, do které uložíme naši datovou sadu. Pak musíme vytvořit objekt typu XmlTextReader, jehož „zdrojem“ bude StringReader, který projde a načte řetězec dsxml. Tento XmlTextReader použijeme k naplnění objektu XmlDocument, jehož přetížená metoda XmlDocument.Load() jako jednu z možností akceptuje XmlTextReader. A nakonec už stačí pouze vytvořit nový objekt typu XmlDocument, naplnit ho připravenými daty a provést požadovanou transformaci.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět