xslt_spravochnik_programmista_2-e_izd.pdf

Upload: alexandr-casapciuc

Post on 07-Jul-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    1/1013

    XSLTProgrammer’s Reference

     Michael Kay

    Second Edition

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    2/1013

     Майкл Кэй

    XSLTСправочник программиста

    СанктПетербург 2002

    Второе издание

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    3/1013

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    4/1013

    Майкл Кэй

    XSLT. Справочник программиста

    Перевод М. Зислиса, Е. Морозова,Г. Нифонтовой, М. Смирнова

    Главный редактор  А. ГалуновЗав. редакцией Н. МакароваНаучный редактор Е. МорозовРедактор  А. ЛосевКорректор С. БеляеваВерстка Н. Гриценко

    Кэй М.XSLT. Справочник программиста. – Пер. с англ. – СПб: СимволПлюс, 2002. –1016 с., ил.

    ISBN 5932860391

    С ростом популярности стандарта XML появилась необходимость в адекватном средстве обработки XMLданных. Консорциумом W3C был разработанXSLT – гибкий и переносимый язык преобразований, используемый и на стороне сервера, и на стороне клиента. Он быстро завоевал популярность: свои реализации XSLTпроцессоров выпустили Microsoft, Oracle и Apache SoftwareFoundation. Эта книга, написанная автором XSLTпроцессора Saxon, поможетосвоить XSLT, научит программированию на нем и послужит отличным справочником в дальнейшей работе.

    Издание состоит из четырех частей: подробного введения в историю возникновения XSLT, его роль, основные понятия и внутреннюю структуру; справочника по элементам и функциям XSLT с детальным описанием всех языковых конструкций; руководства по разработке программ с советами по дизайну и примерами; приложений, содержащих сведения о последних версиях XSLTпроцессоров. Издание проиллюстрировано большим количеством работающих примеров и написано для программистов, знакомых с XML и HTML и желающихвоспользоваться мощными возможностями и совместимостью языка XSLT длясоздания новых вебприложений.

    ISBN 5932860391ISBN 1861005067 (англ)

    © Издательство СимволПлюс, 2002Authorized translation of the English edition © 2001 Wrox Press Ltd. This translationis published and sold by permission of Wrox Press Ltd, the owner of all rights to publish and sell the same.Все права на данное издание защищены Законодательством РФ, включая право на полное или частичное воспроизведение в любой форме. Все товарные знаки или зарегистрированные товарные знаки, упоминаемые в настоящем издании, являются собственностью соответствующих фирм.

    Издательство «СимволПлюс». 193148, СанктПетербург, ул. Пинегина, 4,тел. (812) 3245353, [email protected]. Лицензия ЛП N 000054 от 25.12.98.

    Налоговая льгота – общероссийский классификатор продукцииОК 00593, том 2; 953000 – книги и брошюры.

    Подписано в печать 28.03.2002. Формат 70х1001/16 .Печать офсетная. Объем 63,5 печ. л. Тираж 2000 экз. Заказ N

    Отпечатано с диапозитивов в Академической типографии «Наука» РАН199034, СанктПетербург, 9 линия, 12.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    5/1013

    Оглавление

    Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    Глава 1. Общее представление об XSLT  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Что такое XSLT? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Как XSLT преобразовывает XML? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Положение XSLT в технологиях XML  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35История развития XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42XSLT как язык  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48За рамками XSLT 1.0  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54В каких случаях необходимо использовать XSLT  . . . . . . . . . . . . . . . . . . . . . . . . . 57Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Глава 2. Модель обработки данных в XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    XSLT: обзор системы  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Древовидная модель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Процесс преобразования  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Переменные, выражения и типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

    Глава 3. Структура таблицы стилей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    Модульное строение таблицы стилей  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Элемент  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Инструкция обработки  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Встроенные таблицы стилей  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126Элементы верхнего уровня. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Упрощенные таблицы стилей  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Тела шаблонов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Шаблоны значений атрибутов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

    Расширяемость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Совместимость с последующими версиями  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Пробельные символы  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    6/1013

    6 Оглавление

    Глава 4. Элементы XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

    xsl:applyimports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174xsl:applytemplates  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178xsl:attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    xsl:attributeset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198xsl:calltemplate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204xsl:choose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213xsl:comment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215xsl:copy  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217xsl:copyof  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221xsl:decimalformat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226xsl:document  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231xsl:element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

    xsl:fallback. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243xsl:foreach  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248xsl:if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253xsl:import. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256xsl:include  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268xsl:key  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272xsl:message. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281xsl:namespacealias  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284xsl:number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

    xsl:otherwise  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302xsl:output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303xsl:param . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316xsl:preservespace  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320xsl:processinginstruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325xsl:script  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328xsl:sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330xsl:stripspace  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336xsl:stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337xsl:template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349xsl:text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360xsl:transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366xsl:valueof. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366xsl:variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370xsl:when . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381xsl:withparam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

    Глава 5. Выражения  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386

    Система обозначений  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387С чего начать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387Синтаксическое дерево . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    7/1013

    Оглавление 7

    АбсолютныйМаршрутПоиска (AbsoluteLocationPath)  . . . . . . . . . . . . . . . . . . . . 390АддитивноеВыражение (AdditiveExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391Аргумент (Argument) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392ВызовФункции (FunctionCall) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394Выражение (Expr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396ВыражениеИ (AndExpr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400ВыражениеИЛИ (OrExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401ВыражениеОбъединения (UnionExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402ВыражениеОтношения (RelationalExpr). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404ВыражениеПути (PathExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407ВыражениеРавенства (EqualityExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409ИмяБезДвоеточия (NCName) и СимволИмениБезДвоеточия (NCNameChar)  . . 416ИмяОператора (OperatorName)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

    ИмяФункции (FunctionName) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419КритерийИмени (NameTest)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420КритерийУзла (NodeTest)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422Литерал (Literal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424МаршрутПоиска (LocationPath)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427МультипликативноеВыражение (MultiplicativeExpr). . . . . . . . . . . . . . . . . . . . . 428НазваниеОси (AxisName) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430Оператор (Operator)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435ОператорУмножения (MultiplyOperator)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436ОтносительныйМаршрутПоиска (RelativeLocationPath)  . . . . . . . . . . . . . . . . . . 437ПервичноеВыражение (PrimaryExpr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439ПолноеИмя (QName) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440Предикат (Predicate). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443ПредикативноеВыражение (PredicateExpr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446ПробельныеСимволыВыражения (ExprWhitespace) . . . . . . . . . . . . . . . . . . . . . . 447СокращенныйАбсолютныйМаршрутПоиска(AbbreviatedAbsoluteLocationPath) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449

    СокращенныйОтносительныйМаршрутПоиска(AbbreviatedRelativeLocationPath)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450СокращенныйСпецификаторОси (AbbreviatedAxisSpecifier) . . . . . . . . . . . . . . . 452СокращенныйШаг (AbbreviatedStep)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453СпецификаторОси (AxisSpecifier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455СсылкаНаПеременную (VariableReference) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456ТипУзла (NodeType) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458УнарноеВыражение (UnaryExpr)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459ФильтрующееВыражение (FilterExpr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460

    Цифры (Digits)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463Число (Number) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Шаг (Step)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465ЭлементВыражения (ExprToken)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    8/1013

    8 Оглавление

    Глава 6. Образцы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

    Формальное определение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473Неформальное определение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475Разрешение конфликтов  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476

    Как читать эту главу. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476Образец (Pattern). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477ОбразецМаршрутаПоиска (LocationPathPattern)  . . . . . . . . . . . . . . . . . . . . . . . . 478ОбразецОтносительногоПути (RelativePathPattern) . . . . . . . . . . . . . . . . . . . . . . 480ОбразецШага (StepPattern)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482СпецификаторОсиChildИлиAttribute (ChildOrAttributeAxisSpecifier) . . . . . . . 487ОбразецКлючаИлиID (IdKeyPattern)  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492

    Глава 7. Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495ceiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497concat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498contains  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501count. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502current . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505document  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509elementavailable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522

    false  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528floor  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529formatnumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531functionavailable  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535generateid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539id. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545key  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548lang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555

    last  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559localname  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566namespaceuri  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572normalizespace  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575not. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580position. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582round  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586

    startswith  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589string  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591stringlength  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593substring  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    9/1013

    Оглавление 9

    substringafter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599substringbefore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604systemproperty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608translate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611true . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613unparsedentityuri  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616

    Глава 8. Разработка функций расширения  . . . . . . . . . . . . . . . . . . . . . . . . . . . 617

    Когда необходимо применять функции расширения?. . . . . . . . . . . . . . . . . . . . . 618Вызов функций расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619Какой язык выбрать? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619

    Привязка функций расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Деревья XPath и объектная модель документа  . . . . . . . . . . . . . . . . . . . . . . . . . . 621Привязки для языка Java  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625Привязки для языка JavaScript  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649

    Глава 9. Образцы проектирования таблиц стилей . . . . . . . . . . . . . . . . . . . . 651

    Таблица стилей для заполнения бланков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652Навигационные таблицы стилей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655

    Таблицы стилей, основанные на правилах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658Вычислительные таблицы стилей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684

    Глава 10. Действующие примеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685

    Форматирование спецификации XML  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686Генеалогическое дерево  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709Таблица стилей для маршрута коня  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750

    Приложение A. Microsoft MSXML3  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751

    Приложение B. Oracle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808

    Приложение C. Saxon  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828

    Приложение D. Xalan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860

    Приложение E. Другие продукты  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889

    Приложение F. TrAX: API для XMLпреобразований  . . . . . . . . . . . . . . . . . 913

    Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950

    Алфавитный указатель  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966

    http://xsltix.pdf/http://xsltix.pdf/

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    10/1013

    Об автореМайкл Кэй работает в Software AG, где занимается стандартами и интерфейсами для создаваемой ее специалистами линейки продуктов XML, в основном для баз данных Tamino. Он также представляет Software AG в рабочейгруппе W3C по XSL. До этого большую часть своей карьеры Майкл занимался разработкой программных продуктов и систем в ICL. Его специализация(и степень Ph.D., полученная в Кембридже) имеет прямое отношение к базамданных – он проектировал программные продукты для сетевых, реляцион

    ных и объектноориентированных баз данных, а также текстовые поисковыемашины. В сообществе XML Майкл Кэй известен как разработчик XSLTпроцессора Saxon – продукта с открытым исходным кодом – первой полностью совместимой реализации стандарта XSLT.

    Майкл живет в Рединге, графство Беркшир, с женой и дочерью. Увлекается,как можно понять из примеров в этой книге, генеалогией и хоровым пением.

    Благодарности

    Прежде всего, я хотел бы отметить титанический труд рабочей группы W3Cпо XSL, создавшей язык XSLT. Без их усилий не было бы ни языка, ни этойкниги. Первое издание, написанное еще до моего вступления в группу, было«взглядом со стороны», и я постарался сохранить этот же стиль во второмиздании, несмотря на то, что теперь надо мной тяготеет доля ответственности за текущее состояние спецификации.

    Особая моя благодарность Джеймсу Кларку, редактору спецификаций XSLTи XPath, который вежливо и быстро отвечал на великое множество вопросов.

    Многое из того, что я знаю об XSLT, почерпнуто от участников списка рассылки по XSL, притом не только от экспертов, отвечающих на вопросы, но иот огромного количества новичков, их задающих. Масса технических приемов и пояснений появилась во втором издании благодаря идеям, витавшим вэтой конференции.

    Еще я хочу поблагодарить ICL и Software AG, моих работодателей, которыеподдерживали и поощряли меня во время работы над этим проектом.

    Редакторы Wrox Press и технические рецензенты внесли неоценимый вкладв подготовку моей книги, указав на многочисленные места, которые требовали улучшения.

    И наконец, я еще раз хочу поблагодарить за поддержку Пенни и Пиппу, которые восприняли новость о том, что я планирую начать работу над вторымизданием, со вздохом смирения.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    11/1013

    Введение

    Не будет преувеличением сказать, что язык XML стал самым большим потрясением, всколыхнувшим Сеть, за все время ее существования – чуть меньше десятилетия. Он также – одно из самых многообещающих средств мирауправления информацией. Сам по себе XML фактически ничего не делает,вся его заслуга в том, что он обеспечивает способ структурирования информации и передачи ее из одной программы в другую. До сих пор для созданияприложения, которое обладало бы достоинствами XML, пришлось бы писатькод низкого уровня, используя интерфейсы (такие как DOM и SAX), требующие очень серьезного знания способа организации данных.

    Это напоминает мне методы, с помощью которых раньше, до появления SQL,приходилось обращаться к базам данных (вы видели седину в волосах на фо

    тографии на обложке книги); и когда я впервые увидел язык преобразований XSL (XSL Transformation), XSLT, я понял, что он сыграет роль SQL дляСети: высокоуровневый язык оперирования данными, который превратитXML из просто формата для сохранения и передачи данных в активный источник информации, к которому можно обращаться с запросами и которымможно управлять с помощью гибких, декларативных методов.

    В начале 1998 года я искал способы включения XML в средства управлениясодержимым для вебпубликаций и начал разрабатывать библиотеку Javaпод названием Saxon, чтобы предоставить высокоуровневые интерфейсы дляуправления XML. Я очень критично относился к первым проектам XSL, ноодновременно с ускорением процесса стандартизации я начал осознаватьфакт возникновения полезного и мощного языка и решил изменить направленность программного пакета Saxon, чтобы превратить его в XSLTпроцессор. Когда 16 ноября 1999 года вышла, наконец, рекомендация по XSLT версии 1.0, я уже через 17 дней смог объявить о готовой, полностью совместимой реализации с открытыми исходными текстами.

    Хотя я осознавал мощь и возможности языка XSLT, я видел также, что он

    включает в себя некоторые новые и трудные концепции, с которыми сражаются первые пользователи. Это напомнило мне о начале работы с SQL: сейчас это трудно представить, но когда SQL только появился, его радикальноновые концепции, в частности внутренние и внешние соединения и трехзначная логика, были весьма трудны для понимания.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    12/1013

    12 Введение

    Именно поэтому я написал эту книгу. XSLT – захватывающий и мощныйязык, но не настолько простой, чтобы постичь его сразу. До сих пор имелосьочень немного доступных ресурсов по XSLT, кроме официальной спецификации W3C непосредственно, которая примерно так же читабельна длябольшинства программистов, как страницы налогового законодательства. Я

    надеюсь, что эта книга заполнит имеющийся пробел и поможет освоить огромный потенциал этого нового языка.

    Для кого эта книга?

    Я написал эту книгу для профессиональных разработчиков программ, которые уже использовали ряд языков в прошлом и теперь хотят научиться работать с XSLT для создания новых приложений. Я предполагаю, что читатели имеют основное представление об XML, хотя понимаю, что, если они и

    знали когдато, что такое внешняя общая анализируемая сущность, то, возможно, уже забыли это. Я рассчитываю также на понимание общей архитектуры Сети и HTML.

    Я не предполагаю обязательного знания любого конкретного языка программирования, хотя писал книгу в расчете на то, что читатели имеют некоторый опыт программирования. Если весь этот опыт заключается лишь в написании страниц HTML с небольшими включениями Javascript, часть материала книги может показаться нелегкой.

    Зачем второе издание?

    Основная причина выхода второго издания всего лишь через год после первого в том, что язык XSLT теперь гораздо лучше поддерживается программными продуктами, а книга, которая описывает только язык, ничего не сообщая о доступных программах, делает только половину дела. Год назадMSXML3 от Microsoft был ранней реализацией, в которой обеспечиваласьтолько половина стандарта; а сегодня он полностью поддерживает стандарт

    и полностью соответствует ему. И не только Microsoft работает в этом направлении; в приложениях к книге я описал дюжину других XSLTпроцессоров, из которых можно выбирать.

    Произошли изменения и в самих стандартах – вышел рабочий проектXSLT 1.1. В книге ему уделено много внимания, потому что многие особенности проекта уже реализуются в программных продуктах.

    Наконец, сообщество XSLT изобрело много оригинальных способов использования языка XSLT 1.0 – путей обхода его ограничений, которые не устра

    ивают когото. В первом издании я утверждал категорически (и необдуманно), что не существует возможности построения пересечения двух наборовузлов; но прежде чем высохли чернила, я уже нашел решение проблемы. Иблестящее применение Стивом Мюнчем (Steve Muench) функции key() для решения проблем группировки, безусловно, должно найти свое место в книге.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    13/1013

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    14/1013

    14 Введение

    упорядочен скорее по принципу легкости поиска нужной информации, чемпо последовательности изложения: элементы XSLT – в главе 4, выраженияXPath – в главе 5, синтаксис образцов – в главе 6, а библиотеки стандартныхфункций – в главе 7. Наконец, в главе 8 описаны введенные в рабочий проект XSLT 1.1 новые возможности (которые еще могут претерпеть измене

    ния) для вызова из таблицы стилей XSLT внешних функций, написанных наJava или JavaScript. Многие из этих глав организованы в алфавитном порядке, что позволяет быстро найти сведения о конкретной особенности языка.

    Третья часть книги, главы 9 и 10, предназначена помочь применению языкаXSLT для разработки реальных промышленных приложений. В главе 9 обсуждается ряд образцов проектирования, а в главе 10 приведены три подробных примера разработок.

    Наконец, в большинстве приложений даны сведения о конкретных программных продуктах. Информация об MSXML3 от Microsoft, Oracle, Saxon иXalan выделена в отдельные приложения, где описываются API, используемые для вызова этих продуктов, взаимосвязь с другими программными продуктами того же поставщика и подробно обсуждаются зависящие от производителя дополнения и ограничения. В приложении E дан менее детальныйобзор возможностей широкого круга других изделий, включая и XSLTпроцессоры (4XSLT, Infoteria, Sablotron, Transformiix и Unicorn), и инструментальные средства разработки XSLT, в том числе Stylus Studio, Whitehill'sXSL Composer и XML Spy. Автор не пытался привести здесь всю необходимую информацию по каждому продукту, а скорее дал сводку характеристик

    каждого из них, чтобы читатели имели возможность сделать обоснованныйвыбор и исследовать его далее.

    Приложение F несколько выпадает из общего стиля. В нем описываетсяTrAX API, который представляет собой Java API для управления XSLTпреобразованиями. Он занимает положение среднего звена между спецификациями, не зависящими от поставщика, и данными по конкретным изделиям(этот API выпущен компанией Sun и в настоящее время реализован в процессорах Saxon и XalanJava).

    В конце книги приведены полезный глоссарий терминов и индекс.

    Другие ресурсы по XSLT

    Если читатель не сможет найти необходимые сведения в книге, у него естьвозможность поискать ответы на свои вопросы в Сети, где есть несколько хороших ресурсов по данной тематике. Чтобы не приводить длинный списоксайтов, имеющих отношение к XSLT, перечислим только те из них, которыесодержат хорошие подборки ссылок1:

    1 Русскоязычным читателям можно предложить сайт xmlhack.ru, на которомнаходятся также ссылки на другие русскоязычные ресурсы по XML и XSLT. –Примеч. науч. ред.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    15/1013

    Введение 15

    • http://www.w3.org/Style/XSL/

    Это официальный сайт Консорциума World Wide Web. Там содержатсявсе изданные спецификации и рабочие проекты, а также большое количество новостей, статей и официальных документов.

    • http://www.xslinfo.com/Это хорошо организованный сайт, созданный Джеймсом Таубером (JamesTauber) и состоящий почти полностью из классифицированного перечняпрограммного обеспечения XSL, статей, руководств и других ресурсов.

    • http://www.oasisopen.org/cover/xsl.html

    Страницы ссылок Робина Ковера (Robin Cover) обеспечивают всесторонний охват всего, что случается или когдалибо случалось в мире SGML иXML. Здесь приведена ссылка на его раздел по XSL.

    • http://www.xml.com/Хороший сайт с критическими обзорами и сводками новостей, касающимися мира XML вообще.

    • http://msdn.microsoft.com/xml/

    Этот URL является хорошим местом для знакомства со взглядом Microsoft на мир XML и XSL. Множество полезных статей и официальных документов, не всегда ограничивающихся только их собственными продуктами.

    • http://www.mulberrytech.com/xsl/xsllist

    Домашняя страница почтовой рассылки XSL, очень объемного, но чрезвычайно полезного обсуждения всех проблем XSLT, от вопросов новичков до глубоких теоретических дебатов. Даже если нет времени для участия в дискуссиях, можно воспользоваться архивом и ссылками с домашней страницы на различные FAQ и обучающие сайты.

    Что необходимо для работы с этой книгой?Чтение книги о новом языке не сделает читателя экспертом по языку; дляэтого требуется применять язык и учиться на своем опыте. В этой книге естьмного примеров, которые стоит запустить, но более важно то, что они могутстимулировать читателей опробовать собственные идеи.

    Все коды работающих примеров можно загрузить со страниц вебсайта http://www.wrox.com, посвященных этой книге.

    В приложениях перечислены некоторые доступные XSLTпродукты, и, что

    немаловажно, там есть хороший выбор. В основном это свободные программы (freeware), хотя всегда следует читать условия лицензирования.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    16/1013

    16 Введение

    Можно начать с продукта Microsoft – MSXML3. Его можно загрузить с вебстраницы http://msdn.microsoft.com/xml, а в приложении A даны инструкции по установке. MSXML3 позволяет запускать таблицы стилей XSLT прямо в броузере Internet Explorer. Этот программный пакет хорошо соответствует спецификации языка XSLT 1.0. Однако он имеет один большой

    недостаток: отсутствует понятная диагностика ошибок.По этой причине для платформы Windows можно предложить начинать с:

    • Instant Saxon, доступного по адресу:

    http://users.iclway.co.uk/mhkay/saxon/instant.html

    • Programmer's File Editor (PFE), доступного на различных архивныхсайтах, включая:

    http://www.simtel.net/pub/simtelnet/win95/editor/pfe101i.zip

    Рекомендации относительно Instant Saxon можно считать предвзятыми, поскольку он создан автором книги. Достоинство Saxon в том, что он полностью отвечает стандарту, является открытым программным продуктом и еголегко устанавливать и использовать. Все примеры, приведенные в книге,проверены с использованием Saxon. Они должны также работать с процессорами MSXML3, Xalan и Oracle XSL, – все это замечательные изделия, которые обещают 100процентное соответствие стандарту, но это не проверялось.

    Подобно большинству других Javaоснованных процессоров, Saxon требуетсоздания и редактирования файлов XML и таблиц стилей в текстовом редак

    торе и запуска их из командной строки операционной системы. Для тех, ктовырос на Windows, это может показаться довольно примитивным. PFE рекомендован, потому что он содержит интуитивный текстовый редактор, который позволяет открывать сразу большое количество файлов, и потому что ондает доступ к командной строке операционной системы привычным дляWindows способом. Вместо этого редактора можно использовать и другие.Автор не настаивает только на PFE.

    В приложениях описывается несколько программных продуктов для неWindows платформ, написанных на Java и выполняющихся почти в любой

    среде. Нужно только установить виртуальную машину Java на своемкомпьютере и ознакомиться с механизмом установки и выполнения приложений Java в конкретной среде.

    Условные обозначения

    Для удобства пользования книгой принят ряд условных обозначений.

    Работающие примеры – те, которые можно загрузить и опробовать непо

    средственно – оформлены следующим образом:

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    17/1013

    Введение 17

    Исходный документ

    В этом разделе даются исходные данные XML, входной документ для пре

    образования. Если имя файла выглядит как example.xml, этот файл можнонайти в архиве и загрузить с вебсайта Wrox1 http://www.wrox.com/, какправило, из подкаталога, содержащего все примеры для данной главы.

    Таблица стилей

    В этом разделе описывается таблица стилей XSLT, используемая для данного преобразования. Будет приведено еще одно имя файла типаstyle.xsl, по которому можно найти эту таблицу стилей в архиве загруз

    ки вебсайта Wrox.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    18/1013

    18 Введение

    записывать примеры по типу «select="'Madrid'"», где кавычки " и ' – частьобразца кода, а двойные угловые кавычки « и » – нет.

    • Имена элементов XML, имена функций и атрибутов выделяются жирныммоноширинным шрифтом: , concat(), href.

    Кроме того:

    Подобное выделение содержит важную информацию по обсуждаемому вопросу, которую следует помнить.

    В то время как подобный стиль используется для вопросов, находящихся в стороне от текущего обсуждения.

    Синтаксические правила (которые встречаются главным образом в главах 5и 6) в значительной степени соответствуют соглашениям, принятым в стандартах W3C, за исключением использования двойных угловых кавычек длязаключения в них литералов. Основными условными обозначениями, используемыми в этих синтаксических правилах, являются:

    Поддержка читателей

    Издательство Wrox осуществляет поддержку книг тремя способами. Читатели могут:

    • Ознакомиться с обнаруженными опечатками на вебсайте www.wrox.com.

    • Принять участие в форумах на вебсайте p2p.wrox.com.

    • Послать по электронной почте запрос на техническую поддержку илипросто свое мнение о книгах Wrox.

    Выражение Значение

    clause|paragraph Либо clause, либо paragraph. Значения clause и paragraph будутопределены отдельными правилами: это нетерминальныеконструкции. Вертикальная черта «|» используется для разделения вариантов.

    «!»|«?» Либо восклицательный, либо вопросительный знак. Словаили символы, заключенные в двойные угловые кавычки,должны использоваться, как написано: это терминальныеконструкции.

    adjective noun «.» adjective, сопровождаемое noun, за которым следует точка.

    adjective? noun Только noun или adjective, сопровождаемое noun. «?» указывает, что предшествующая конструкция необязательна.

    adjective* noun Ни одного или более adjective, сопровождаемых noun.

    adjective+ noun Одно или более adjective, сопровождаемых noun.

    sentence («?»|«!») sentence, сопровождаемое вопросительным или восклицательным знаком. Круглые скобки обозначают группировку.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    19/1013

    Введение 19

    Опечатки

    На вебсайте www.wrox.com  можно ознакомиться с опечатками в книге,просто перейдя на страницу, посвященную этой книге, где будет ссылка наперечень опечаток.

    Почтовые рассылки

    Можно принять участие в дискуссионных форумах пользователей на вебсайте p2p.wrox.com, где можно задавать вопросы автору книги, рецензентами другим специалистам в этой области. Почтовая рассылка по XSLT находится в разделе 'XML'. Можно присоединиться к списку подписчиков илизаказать эту рассылку в форме еженедельного дайджеста. Если нет времениили возможности получать рассылку, то можно просматривать ее архив,доступный в Интернете. Там обеспечена возможность поиска по конкретнойтематике или по ключевым словам. Поскольку эти рассылки администрируются, это гарантирует быстрый поиск полезной, точной информации. Почтовые сообщения могут редактироваться модераторами или перемещаться всоответствующие разделы, что делает этот ресурс очень эффективным. Сообщения, не относящиеся к теме обсуждения, и спам удаляются, а адресаэлектронной почты подписчиков защищены уникальной системой Lyris отвеброботов, которые могут автоматически собирать адреса участников почтовых рассылок и телеконференций.

    Поддержка по электронной почтеПри обнаружении новой опечатки в книге можно сообщить о ней на вебсайтили прямо обсудить это с экспертом, который детально знает книгу, пославсообщение по адресу [email protected]. В этом сообщении желательно указать следующие детали:

    • В поле Subject – название книги, последние четыре цифры ISBN книги иномер страницы с предполагаемой опечаткой.

    • В теле сообщения – свое имя, контактную информацию и описание обнаруженной опечатки.

    Сообщите нам свое мнениеАвтор книги и коллектив издательства Wrox упорно трудились, чтобы сделать чтение этой книги приятным и полезным удовольствием для читателей, поэтому мнение читателей очень ценно. Мы всегда готовы прислушаться к тому, что читателям понравилось больше всего и какие улучшения, по

    их мнению, возможны. Автор книги и коллектив издательства Wrox оченьценят обратную связь и учитывают в последующей редакционной работе каккритику, так и похвалу. При необходимости комментарии и вопросы пересылаются автору. Все, кто желает высказать чтото по поводу книги, могутприслать сообщение по адресу: [email protected].

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    20/1013

    1Общее представление об XSLT

    Эта глава призвана дать общее представление о языке XSLT. В ней говорится о сути XSLT и задачах, для выполнения которых он предназначен. О том,к какому типу языков принадлежит XSLT, как он зарождался и как соотносится со всеми другими технологиями, которые используются в типичныхвебприложениях. Здесь мало внимания уделяется тому, как выглядит таб

    лица стилей XSLT и как она работает: это обсуждается позже, в главах 2 и 3.Сначала речь пойдет о задаче, для выполнения которой разработан XSLT, –преобразовании – и о том, зачем нужно преобразовывать XMLдокументы.На тривиальном примере будет показано, что это означает практически.

    Далее обсуждается соотношение XSLT с другими стандартами растущего семейства языков XML, чтобы в контексте показать его назначение и объяснить, как он дополняет другие стандарты.

    Также здесь будет описано, что из себя представляет язык XSLT, и хроноло

    гически показано, как он развивался. Нетерпеливые читатели могут пропустить хронологию и сконцентрироваться на использовании языка, но рано или поздно они задумаются, почему же он создан именно таким. Авторнадеется, что в этот момент они вернутся, чтобы прочесть о том, как XSLTпоявился на свет.

    В конце будут затронуты различные пути использования XSLT в рамках общей архитектуры приложения, в котором неминуемо будут задействованымногие другие технологии и компоненты, играющие свои собственные роли.

    Что такое XSLT?XSLT, что означает eXtensible Stylesheet Language: Transformations  (расширяемый язык таблиц стилей: Преобразования), – это язык, который, со

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    21/1013

    Что такое XSLT? 21

    гласно самой первой фразе в спецификации (ее можно найти по адресу http://www.w3.org/TR/xslt), предназначен, в первую очередь, для преобразованияодного XMLдокумента в другой. Однако XSLT способен не только преобразовывать XML в HTML и многие другие основанные на тексте форматы, поэтому более общим определением будет следующее:

     XSLT – это язык для преобразования структуры XMLдокумента.

    Зачем это нужно? Чтобы правильно ответить на этот вопрос, выясним сначала, почему XML завоевал такой успех и вызвал такой ажиотаж.

    Зачем преобразовывать XML?

    Технология XML – простой, стандартный способ взаимообмена структурированными текстовыми данными между компьютерными программами.

    Рост ее популярности связан отчасти с тем, что для прочтения XMLдокументов или для их создания достаточно простого текстового редактора, ноэто никак не умаляет основного назначения XML – служить средством связимежду программными системами. В этом плане XML удовлетворяет двумнасущным потребностям:

    • Отделение данных от их представления. Потребность отделять информацию (например, прогноз погоды) от деталей способа ее отображения наконкретном устройстве. Необходимость в этом все возрастает по мере расширения круга устройств, имеющих доступ к Интернету. Организации,вложившие свои средства в создание полезных источников информации,должны иметь возможность поставлять их не только для традиционныхкомпьютерных вебброузеров (которые сейчас тоже очень разнообразны),но также и для телевизоров, и сотовых телефонов, не говоря уже о сохраняющейся потребности в печатной информации.

    • Передача данных между приложениями. Потребность передавать информацию (заказы и счета) из одной организации в другую, не тратя при этомсредства на интеграцию специально заказываемого программного обеспечения. С увеличением темпов роста электронной коммерции объем данных, которыми предприятия обмениваются между собой, ежедневно растет, и эта потребность также становится все более насущной.

    Безусловно, эти два пути использования XML не являются взаимоисключающими. Счет можно представить на экране или ввести в финансовое приложение, а метеорологические данные вместо прямого отображения могутбыть также проанализированы, проиндексированы и сгруппированы самимполучателем. Еще одним ключевым преимуществом XML является его способность объединять миры документов и данных, обеспечивая единый спо

    соб представления структуры, независимо от того, предназначена ли информация для человека или для машины. Идея в том, что XMLданные, получаемые в итоге людьми или приложением, очень редко будут использоватьсяпрямо в том виде, в каком они поступают: сначала они должны быть преобразованы в нечто другое.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    22/1013

    22 Глава 1. Общее представление об XSLT

    Если данные предназначены для человека, это «нечто» может быть документом, который можно отобразить или распечатать: например HTMLфайлом,PDFфайлом или даже звуковым файлом. Конвертирование данных XML вHTML для отображения – вероятно, наиболее частое применение XSLT сегодня, и именно оно будет использоваться в большинстве примеров в этой

    книге. Получив данные в формате HTML, их легко отобразить с помощьюлюбого броузера.

    Для передачи данных между разными приложениями необходимо преобразовать их из модели, используемой одним приложением, в модель, используемую другим. Для загрузки данных в приложение подходят различныеформаты: файлы с разделителямизапятыми, сценарии SQL, HTTPсообщения или последовательность вызовов какоголибо программного интерфейса. Как вариант это может быть и XMLфайл, использующий словарь, отличный от словаря исходного документа. С распространением основанной

    на XML электронной коммерции роль XSLT в преобразовании данных между приложениями также становится все более важной. То, что XML используют все, не может отменить потребность в преобразовании данных. Всегдабудет одновременно существовать множество стандартов. Например, газетная индустрия, вероятно, будет использовать для обмена статьями не такиеформаты, как радиовещание. Кроме того, никогда не отпадет нужда в такихвещах, как извлечение адреса клиента из заказа на товары и внесение его вбланк счета. Так что электронная коммерция будет все больше становитьсяпроцессом определения способа извлечения и комбинирования данных из

    одного набора XMLдокументов для создания другого набора XMLдокументов, и XSLT – идеальный инструмент для этой работы.

    В конце этой главы будут приведены конкретные примеры использованияXSLT для преобразования XML. Здесь же главным было – дать читателю почувствовать важность и полезность преобразования XML. Прежде чем перейти к более подробному обсуждению языка XSLT и увидеть, как он работает, рассмотрим пример, хорошо показывающий многообразие форматов, вкоторые с помощью языка XSLT можно преобразовать XMLдокументы.

    Пример: Преобразование музыкиВебстраница http://www.xml.org/xmlorg_registry/index.shtml  – превосходныйреестр словарей и схем XML.

    Там можно найти с полдюжины различных схем XML для описания музыки. Все они были созданы для разных задач: требования к языку разметки,который используется издателем печатных нотных альбомов, отличаются оттех, что предъявляются к языку, позволяющему слушать музыку с помощью броузера. Например, язык MusicML ориентирован на графическое

    отображение музыкальных нот; ChordML предназначен для кодированиямузыкального сопровождения (гармонического аккомпанемента) песен; MusicXML разработан для представления музыкальных партитур, в особенности западных нотных записей XVII века, в то время как гораздо более академичный язык разметки музыки MML (Music Markup Language), созданный в

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    23/1013

    Что такое XSLT? 23

    университете Претории (University of Pretoria), предназначен для серьезного музыковедческого анализа и охватывает восточные, африканские, а также западные музыкальные стили (рис. 1.1).

    Таким образом, с помощью XSLT можно произвести разметку музыки многими различными способами:

    • Можно использовать XSLT для конвертирования музыки из одного изэтих представлений в другое, например из MusicXML в MML.

    • Можно использовать XSLT для преобразования музыки из любого изэтих представлений в визуальные нотные записи, генерируя основанныйна XML векторный графический формат SVG.

    • Можно использовать XSLT для проигрывания музыки на синтезаторе, генерируя файлы MIDI (Musical Instrument Digital Interface, Цифровой интерфейс музыкальных инструментов).

    • Можно использовать XSLT для изменения музыки, например, для транспонирования ее в другую тональность.

    • Можно использовать XSLT для извлечения текста песни в документ HTMLили текстовый XML.

    Как видите, XSLT служит для преобразования XMLдокументов не только вHTML!

     Рис. 1.1. Разметка музыки

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    24/1013

    24 Глава 1. Общее представление об XSLT

    Как XSLT преобразовывает XML?

    Возможно, читатели книги уже задумывались, как же работает XSLT сXMLдокументом при конвертировании его в требуемый формат. Эта обработка включает обычно два аспекта:

    • Первая стадия – структурное преобразование, при котором структураданных исходного XMLдокумента конвертируется в структуру, отражающую желаемый вывод.

    • Вторая стадия – форматирование, при котором новая структура выводится в заданном формате, например HTML или PDF.

    Вторая стадия охватывает вопросы, обсуждавшиеся в предыдущем разделе.Структуру данных, к которой приводит первая стадия, можно вывести какфайл формата HTML, текстовый или XMLдокумент. Вывод HTML позволя

    ет людям просматривать полученные данные прямо в броузере или в любомсовременном текстовом процессоре. Вывод в текстовой форме дает возможность отформатировать данные таким способом, который будет приемлемымдля конкретного приложения, например, разделяя значения запятыми илииспользуя еще какойто из множества текстовых форматов обмена данными, которые были разработаны еще до появления XML. И наконец, вывод вформате XML позволяет поставлять данные в приложения нового поколения, которые принимают непосредственно XML. Как правило, выходнойфайл будет использовать словарь тегов XML, отличающийся от словаря ис

    ходного документа: например XSLTпреобразование может представить исходные данные ежемесячных продаж в виде гистограммы, используя дляэтого основанный на XML стандарт для векторной графики SVG. Такжеможно использовать XSLTпреобразование с целью генерировать форматVoxML для звукового исполнения полученных данных.

    Ссылки на информацию о языке разметки голоса VoxML (Voice Markup Language)фирмы Motorola можно найти по адресу http://www.oasisopen.org/cover/voxML.html.

    Давайте углубимся теперь в первую стадию, преобразование, – стадию, с которой, прежде всего, имеет дело XSLT и которая обеспечивает возможностьполучения на выходе разнообразных форматов данных. Эта стадия можетвключать выборку данных, их объединение и группирование, сортировкуили выполнение арифметических действий, например перевод сантиметровв дюймы.

    Итак, как же это происходит? До появления языка XSLT исходные XMLдокументы можно было обрабатывать только с помощью специальных приложений собственной разработки. От такого приложения не требовалось про

    ведения структурного анализа необработанного XMLдокумента, но онодолжно было через определенный интерфейс прикладного программирования (API, Application Programming Interface) вызвать синтаксический анализатор XML, чтобы получить из документа информацию и както обработать ее. Для этих целей существует два основных API: SAX (Simple API for

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    25/1013

    Как XSLT преобразовывает XML? 25

    XML, простой API для XML) и DOM (Document Object Model, объектная модель документа).

    SAX – это интерфейс, основанный на событиях, когда по мере анализа документа синтаксический анализатор уведомляет приложение о каждом отдельном фрагменте данных. Если же используется DOM, синтаксический анали

    затор считывает документ и формирует в памяти его древовидную объектную структуру. Можно затем написать собственное приложение (на одном изпроцедурных языков: C++, Visual Basic или Java), которое будет производить анализ полученной древовидной структуры. Это возможно, когда определена специальная последовательность шагов, которые нужно выполнитьдля получения требуемого формата выходного документа. Таким образом,независимо от типа используемого синтаксического анализатора, этот процесс всегда имеет один и тот же существенный недостаток: для каждого нового типа XMLдокумента приходится создавать новую специальную програм

    му, описывая последовательность действий при обработке данного XML.Оба API – DOM и SAX – подробно описаны в книге «Professional XML», Wrox Press, ISBN 1861003110.1

    Почему же использование XSLT для выполнения преобразований XML лучше, чем написание вручную специальных приложений? Идея XSLT основана на том, что все эти приложения похожи друг на друга, и поэтому возможно запрограммировать то, что они делают, используя описательный языквысокого уровня, вместо того, чтобы создавать каждую программу от начала

    и до конца на языках C++, Visual Basic или Java. Нужное преобразованиеможно выразить через набор правил. Эти правила определяют, что должногенерироваться на выходе, когда в исходном документе встречается тот илииной специфический образец. Язык XSLT является описательным в томсмысле, что он описывает требуемое преобразование, а не выдает последовательность инструкций для его выполнения. XSLT лишь описывает необходимое преобразование, а выбор наиболее эффективного способа его осуществления предоставляется XSLTпроцессору.

    XSLT все еще использует синтаксический анализатор XML – неважно, с ка

    ким интерфейсом, DOM или SAX, – чтобы привести XMLдокумент к древовидной структуре. XSLT манипулирует именно древовидным представлением XMLдокумента, а не самим документом. Для читателя, знакомого с интерфейсом DOM, представление структурных единиц XMLдокумента (элементов, атрибутов, инструкций обработки и т. д.) как узлов дерева будет ужепривычным. XSLT – это высокоуровневый язык, который может выполнятьперемещения по дереву, выбирать заданные узлы и производить с нимисложные манипуляции.

    Концепции древовидных моделей XSLT и DOM схожи, но не идентичны. Модель, ис

    пользуемая XSLT, детально обсуждается в главе 2.

    1 Д. Мартин и др. «XML для профессионалов». –  М.: Лори, 2001.

  • 8/18/2019 xslt_spravochnik_programmista_2-e_izd.pdf

    26/1013

    26 Глава 1. Общее представление об XSLT

    Из приведенной ха