XSLT като език

трансформация

Тази книга е за разработване на приложения за трансформиране на XML документи с помощта на XSLT, разширяем стилов език за трансформации. Обсъжда се използването на езиците XSLT и XPath при решаване на практически проблеми: извеждане на документи в HTML формат, използване на различни кодировки за интернационализация и по-специално русификация на приложения и ефективността на съществуващите подходи за решаване на проблеми с преобразуването. За илюстриране на материала са използвани голям брой примери.

За начинаещи и професионални програмисти

Книга: XSLT технология

XSLT като език

Секции на тази страница:

Като цяло всяка трансформация може да бъде разделена на три компонента:

? достъп до обекта, който се преобразува;

? създаване на резултат от трансформация;

? логиката, която свързва първите две стъпки и ръководи процеса на трансформация.

Във връзка с трансформирането на XML документи, първата подзадача означава получаване на информацията, която този документ съдържа - включително информация за структурата, която е неразделна част от него. Призивът в този случай има няколко значения, включително - да разпитвам, да правя заявки, да изчислявам, да избирам; в общ смисъл - да зададете въпроси относно документа и да получите отговор на тях. За тази цел XSLT използва език, наречен XPath – езикът на пътищата в XML документи (от англ. XML Path Language). Както ще видим, XPath е кратко, но изключително мощно средство за достъп до XML документи (както и части от тях). Ролята на XPath в XSLT е толкова голяма, че те биха могли да се считат за едно цяло, ако само XPath не се използва и в други езици, предназначени да работят с XML.

Втората и третата условна част на трансформациятаса прерогатив на самия XSLT. XSLT е XML език в истинския смисъл на думата: XSLT програмите (ще ги наричаме трансформации по предназначение) са добре оформени XML документи. XSLT също използва пространства от имена; почти всички имена, които се появяват в XSLT, като имена на променливи, шаблони, формати и т.н., се третират като разширени имена, характеризиращи се с локална част, заедно с URI - уникален идентификатор на пространство от имена.

За разлика от традиционните императивни езици за програмиране, трансформацията към XSLT не е поредица от действия, които трябва да бъдат извършени, за да се постигне резултат. Трансформацията е набор от шаблонни правила, всяко от които определя процедурата за обработка на определена част от документа. С други думи, трансформацията в XSLT декларира правилата за трансформация - правилата, прилагайки които към входния документ, XSLT процесорът в крайна сметка генерира изходния документ, който е целта на трансформацията.

Като първи пример за XSLT трансформация в тази книга ще разгледаме класическото "Hello, world!" . Листинг 2.1 показва XSLT интерпретацията на "Hello, world!" когато конвертираме документа

в документ като:

Списък 2.1. Трансформацията "Здравей, свят!"

Изходният код, показан по-горе, е добре оформен XML документ. Неговият основен елемент е елементът xsl:stylesheet, който обозначава трансформацията. Атрибутът версия сочи към версията на езика XSLT, спрямо която е изграден този документ; в допълнение, елементът xsl:stylesheet декларира пространство от имена с префикс xsl, което съответства на URI"http://www.w3.org/1999/XSL/Transform" . Всички трансформиращи елементи, които принадлежат към пространството от имена с този URI, ще бъдат третирани от процесора като принадлежащи към езика XSLT.

Елементът xsl:stylesheet има един дъщерен елемент xsl:template, който дефинира правилото за трансформация. Атрибутът match указва, че това правило трябва да обработва елемента msg. Съдържанието на xsl:template е тялото на шаблона. Изпълнява се, когато самият шаблон се приложи към част от документа. В този случай тялото на шаблона ще бъде изпълнено, когато самото правило се приложи към елемента msg.

Тялото на шаблона е елементът съобщение. В условията на XSLT този елемент е буквален елемент на резултата: той не принадлежи към пространството на имената на XSLT и следователно просто ще бъде копиран в получения документ по време на обработката. Съдържанието на този елемент също ще бъде обработено и включено в генерираното му копие.

Съдържанието на елемента съобщение е елемент xsl:value-of, който за разлика от съобщението принадлежи на XSLT. Елементът xsl:value-of оценява XPath израза, даден в неговия атрибут select, и връща резултата от тази оценка. XPath израз, "." , посочен в select , връща самата част от възела, която се обработва в момента, с други думи, елемента msg.

Превеждайки всичко по-горе на български, можем да кажем, че горната трансформация съдържа едно правило: ако в документа се срещне елементът msg, създайте елемент съобщение в изходния документ и включете съдържанието на елемента msg в него.

Синтаксисът XSLT, който е чист XML, може да изглежда необичаен за език за програмиране, но както показва практиката, едва ли друг синтаксис би бил по-удобен. В крайна сметка XSL- това е на първо място трансформацията на XML документи и върху какво, как да не описваме правилата на тази трансформация в XML. В допълнение, XML форматът на самата трансформация позволява използването на същите модели на данни за нейното представяне, както за трансформираните документи.

Съвсем различен е езикът XPath, който в нашия пример е представен от краткия израз "." . XPath не се придържа към синтаксиса на XML, а по-скоро прилича на синтаксиса на пътя в операционните системи—в Глава 4ще покажем колко вярно е това сравнение.

В горната трансформация участва и третата синтактична конструкция, която се нарича в XSLTpattern(от англ. pattern - образец). Шаблонът msg, указан в атрибута за съвпадение на елемента xsl:template, указва коя част от XML документа трябва да бъде обработена от това правило. Синтактично шаблоните са XPath изрази (но не и обратното), но тяхното значение е различно. XPath изразите се оценяват и връщат резултат, докато шаблоните просто съвпадат с някакъв шаблон. В нашата трансформация шаблонът на msg указва, че шаблонът трябва да обработва само елементи на msg и никакви други.

Всяко от шаблонните правила може да извиква други шаблонни правила - в този случай резултатът от изпълнението на извиканите шаблони се включва в резултата от изпълнението на шаблона, който ги е извикал. За да демонстрираме този принцип, ще пренапишем малко шаблона „Здравей, свят!“. така че да връща резултата като HTML документ.