LINQ, XML трансформации
С LINQ към XML можете да извършвате XML трансформации, като използвате два много различни подхода. Първият подход е да приложите езика чрез мостовите класове -XmlReader иXmlWriter. Вторият подход включва използването на самия LINQ към XML API за трансформации чрез функционално конструиране на целевия XML документ и вграждане на LINQ към XML заявката в някакъв XML документ.
Използването на XSLT има предимството, че е стандартна XML технология. Има набор от инструменти, който помага при писане, отстраняване на грешки и тестване на XSLT трансформации. Освен това, тъй като вече съществува, са налични предварително изградени XSLT документи, които могат да се използват в нов код с помощта на LINQ към XML.
Има много налични XSLT документи, от които да избирате. В допълнение, използването на XSLT за трансформации е най-динамично. За разлика от функционалния дизайн на LINQ към XML, не е необходимо да компилирате отново кода, за да промените трансформацията. Простото модифициране на XSLT документа ви позволява да променяте трансформациите по време на изпълнение.
И накрая, XSLT е добре позната технология и има много разработчици, които я познават и могат да помогнат. Що се отнася до подхода на функционалния дизайн, това все още не е така в ранните дни на LINQ.
Прилагането на подхода на функционалния дизайн няма да изисква големи разходи. Това ще ви позволи да извършвате XML трансформации, без да знаете нищо освен LINQ към XML. Така че, ако не сте запознати с XSLT и вашите нужди от трансформация са скромни, този подход може да е по-подходящ. Освен това, въпреки че функционалният дизайн е по-малко удобен отпроста модификация на XSLT документа, необходимостта от повторно компилиране на кода за модифициране на трансформациите може да добави сигурност.
Трансформации с помощта на XSLT
За да извършите трансформацията с помощта на XSLT, трябва да използвате мостовите класове XmlWriter и XmlReader, които се създават от методите CreateWriter и CreateReader на класовете XDocument.
Примерът, показан по-долу, изисква известно обяснение, което ще бъде предоставено, докато се движим през кода. Първо се дефинира таблица със стилове на трансформация:
Тук няма нищо особено забележително. Той просто указва XSL маркирането, за да създаде някакво HTML маркиране за показване на типичен XML документ на служител като HTML таблица. След това се създава XML документ със служители:
Това е просто обикновен XML документ. А сега за това къде започва "магията". Трябва да създадете нов XDocument за трансформираната версия. След това от този документ ще бъде изграден XmlWriter, ще бъде създаден екземпляр на обектаXslCompiledTransform, обектът на трансформация ще бъде зареден с помощта на листа със стилове на трансформация и входният XML документ ще бъде трансформиран в изходния XmlWriter:
Разбира се, след всичко това се показва трансформираната версия на документа. Както можете да видите, и двата мостови класа, XmlWriter и XmlReader, се използват за извършване на трансформацията. Резултатът е показан по-долу:

Трансформация с помощта на функционален дизайн
Въпреки че LINQ към XML поддържа XSLT трансформация, има много ефективни начини за извършване на трансформации, базирани на самия LINQ към XML API.
Логично една трансформация може да се сведе до комбинация от функционално конструирано XML дърво с вградена XML заявка.За да извършите трансформация, комбинирайте функционална конструкция с вградена XML LINQ заявка.
XML трансформациите се обясняват най-добре с пример. Много от предишните примери за LINQ към XML са работили със следното XML дърво:
Да предположим, че това XML дърво трябва да се трансформира в следното:
За извършване на тази трансформация ще се използва функционална конструкция с вградена заявка. Този подход ще конструира функционално нов документ, съответстващ на желаната изходна XML дървовидна структура, получавайки необходимите данни от оригиналния XML документ с помощта на LINQ към XML заявка. Функционалната конструкция и логиката на заявките се определят от желаната изходна дървовидна структура. Кодът е представен по-долу:
Горният код първоначално създава xDocument XML документ, който ще бъде трансформиран и показан. След това се изгражда нов трансформиран xTransDocument и се изгражда основният възел на MediaEmployees, включително атрибута type. След това генерира елемент Employee за всеки елемент Employee в изходния XML, като използва операциите Element и Elements. След това се изгражда самата проекция на елемент Employee с помощта на операцията Select LINQ.Накрая се показва трансформираният XML документ. Да видим дали резултатът е това, от което се нуждаехме:

Всичко мина супер! Резултатът е в съответствие с очакванията. Не е лошо, като се има предвид, че не е използвано нищо друго освен LINQ към XML.