Элемент xslif улучшение внешнего вида таблиц xml xslt


Содержание

Элемент xsl:if улучшение внешнего вида таблиц / xml xslt

ГЛАВА 10
XSL-таблмц стилей

В этой главе вы познакомитесь с последним из рассматриваемых в этой книге методов отображения XML-документов в браузере Microsoft Internet Explorer 5 — расширяемым языком таблиц стилей XSL (Extensible Stylesheet Language). Подобно таблице каскадных стилей (CSS), рассмотренной в главе 7, XSL-таблица стилей связывается с XML-документом и сообщает браузеру, как отображать данные XML. Это позволяет вам открывать XML-документ непосредственно в браузере без посредничества HTML-страницы.

XSL-таблица стилей — мощный и гибкий инструмент для отображения XML-документов, чем CSS-таблица. Используя XSL-таблицы стилей вы можете не только задать формат для каждого элемента XML, как при CSS-таблицы, но и обеспечить средства контроля над выводимыми данными. XSL позволяет выбрать те данные XML, которые вы хотите отобразить, представить эти данные в любом порядке, свободно модифицировать или добавлять информацию. XSL предоставляет вам доступ ко всем компонентам XML (элементам, атрибутам, комментарии и инструкции по обработке). Эта таблица позволяет вам легко сортировать и фильтровать данные XML, дает возможность включать в таблицу стиля сценарии и предоставляет набор полезных методов, которые вы можете использовать при обработке информации.

Базовая форма XSL-таблицы стилей, описываемая в этой главе, избирательно преобразует XML-документ в HTML-страницу, воспринимаемую и отображаемую затем браузером. Получая доступ к богатому арсеналу HTML, вы к методам преобразования XSL добавляете новые возможности по форматированию и обработке данных.

Однако XSL-таблицы являются более сложными для понимания, чем CSS-таблицы. Работа с ними требует знания языка HTML. Кроме того, эта новая технология, поэтому имеет меньшую степень поддержки — меньшую степень унификации среди современных браузеров.

Ссылка. Эта глава знакомит с основами XSL. Вы можете узнать больше об этой мощной, развивающейся технологии XML, обратившись к официальным спецификациям XSL, которые можно найти на Web-страницах, предоставленных консорциумом World Wide Web Consortium (W3C): «Extensible Stylesheet Language (XSL) Version 1.0» по адресу http://www.w3.org/TR/WD-xsl и «XSL Transformations (XSLT) Version 1.0″no адресу http://www.w3.org/TR/WD-xslt. Чтобы подробнее узнать о поддержке XSL в Internet Explorer 5, обратитесь к следующим Web-страницам, предоставленным Microsoft Developer Network (MSDN): «XSL Developer’s Guide» по адресу http://msdn.microsoft.com/xml/xslguide/ default.asp и «XSL Reference» по адресу http://msdn.microsoft.com/ xml/reference/xsl/start.asp.

Основы использования XSL-таблиц стилей

Существуют два основных шага для отображения XML-документа при использовании XSL-таблицы стилей.

  1. Создание файла XSL-таблицы стилей. XSL является приложением. XML, т. е. XSL-таблица представляет собой корректно сформированный XML-документ, который отвечает правилам XSL. Подобно любому XML-документу, XSL-таблица стилей содержит простой текст, и вы можете создать ее с помощью вашего любимого текстового редактора. В последующих разделах рассказывается, как создавать различные типы XSL-таблиц стилей.
  2. Связывание XSL-таблицы стилей с XML-документом. Вы можете связать XSL-таблицу стилей с XML-документом, включив в документ инструкцию по обработке xml-stylesheet, которая имеет следующую обобщенную форму записи:

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

Чаще используют неполный URL, который задает местонахождение относительно месторасположения XML-документа, содержащего инструкцию по обработке xml-stylesheet, например:

(Относительный URL встречается чаще, поскольку вы обычно храните файл таблицы стилей в той же папке, где хранится XML-документ, либо в одной из вложенных в нее папок.)

Подсказка. Хотя вы и можете связать XSL-таблицу стилей с использованием полного URL, таблица стилей при этом должна размещаться на том же домене, что и XML-документ, с которым вы ее связываете. Например, если домен http://mspress.microsoft.com/ содержит XML-документ, то и XSL-таблица стилей должна размещаться на том же домене.

Обычно инструкция по обработке xml-stylesheet добавляется в пролог XML-документа вслед за объявлением XML, как вы увидите в примере XML-документа, рассматриваемого в следующем разделе (см. Листинг 10-2). Более подробная информация об инструкциях по обработке и описании мест в документе, куда они могут быть корректно помещены, содержится в разделе «Использование инструкций по обработке» в главе 4.

Если вы связали XSL-таблицу стилей с XML-документом, вы можете открыть этот документ непосредственно в Internet Explorer 5, и браузер отобразит XML-документ с использованием инструкций по преобразованию, содержащихся в таблице стилей. В отличие от таблиц каскадных стилей, если вы связываете с XML-документом более одной XSL-табли-цы стилей, браузер использует первую таблицу и игнорирует все остальные. Если вы свяжете с XML-документом и CSS-таблицу и XSL-таблицу стилей, браузер использует только XSL-таблицу стилей.

Примечание. Если вы не связали XML-документ ни с CSS-таблицей, ни с XSL-таблицей стилей, Internet Explorer 5 отобразит документ с помощью встроенной XSL-таблицы, которая используется по умолчанию. Эта таблица стилей отображает исходный XML-текст в виде дерева с возможностью свертывания/развертывания уровней (см. раздел «Отобразите XML-документ без таблицы стиля» в главе 2).

Использование одного шаблона XSL

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

В Листинге 10-1 представлен первый пример XSL-таблицы стилей. Эта таблица стилей связана с XML-документом, представленным в Листинге 10-2. (Копии обоих листингов содержатся на прилагаемом к книге CD-ROM в файлах XslDemoOl .xsl и XslDemo0l .xml)

Book Description

Number of pages:

На следующем рисунке показано, как Internet Explorer 5 отображает XML-документ в соответствии с инструкциями из таблицы стилей.

Каждая XSL-таблица стилей должна иметь элемент Документ, представленный ниже. (Напомним, что элемент Документ, известный как корневой элемент, является XML-элементом верхнего уровня, который содержит все остальные элементы.)

Элемент Документ xsl:stylesheet служит не только хранилищем других элементов, но также идентифицирует документ как XSL-таблицу стилей. Этот элемент является одним из XSL-элементов специального назначения, используемых в таблице стилей. Все XSL-элементы принадлежат пространству имен xsl — т. е. вы предваряете имя каждого XSL-элемента префиксом xsl:, обозначающим пространство имен. Вы определяете это пространство имен в начальном теге элемента xsl:stylesheet, например, следующим образом:

Это определение позволяет вам использовать пространство имен внутри элементов таблицы стилей. (Относительно пространства имен в XML см. раздел «Вставка HTML-элементов в XML-документы и использование пространства имен» в главе 7.)

Элемент Документ xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов, которые для краткости будем называть шаблонами. Элемент Документ из Листинга 10-1 содержит только один шаблон, который имеет следующую форму:

Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым вы связываете таблицу стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match аналогичен селектору в правиле CSS). Значение атрибута match носит название образца (pattern). Образец в данном примере («/») представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, содержит инструкции для отображения всего XML-документа.

Каждая XSL-таблица стилей должна содержать один и только один шаблон с атрибутом match, который имеет значение «/». Вы также можете включить один или несколько дополнительных шаблонов с инструкциями для отображения определенных подчиненных ветвей в структуре XML-документа; каждая из них должна иметь образец, отвечающий определенной ветви.

Корневой образец («/») не представляет элемент Документ (или корневой элемент) XML-документа. Он представляет весь документ, для которого элемент Документ является дочерним, т. е. он аналогичен корневому узлу Document в объектной модели документа DOM, рассмотренной в главе 9. Вот полное описание шаблона из рассматриваемой таблицы стилей:

Book Description

Number of pages:

Шаблон содержит два вида XML-элементов.

  • XML-элементы, представляющие HTML-разметку. Примерами подобного вида XML-элемента из рассматриваемой таблицы стилей являются:

Book Description

который отображает заголовок второго уровня,

который отображает блок текста, набранного курсивом (Author:), и

который создает пустую строку.

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

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

  • XSL-элементы. Примеры XSL-элементов из рассматриваемой таблицы стилей являются элементами xsl:value-of, например:

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

XSL-элемент value-of добавляет текстовое содержимое определенного XML-элемента — а также любых его дочерних элементов, которые он имеет — в выходной модуль HTML, который воспринимается и отображается браузером. Вы указываете определенный XML-элемент заданием образца, который присваиваете атрибуту select XSL-элемента value-of. В рассмотренном выше примере элемента value-of атрибуту select присвоен образец «BOOK/AUTHOR», что приводит к выводу текстового содержимого элемента AUTHOR XML-документа. Текстовое содержимое элемента AUTHOR состоит из символьных данных, принадлежащих двум его дочерним элементам, FIRSTNAME и LASTNAME.

Обратите внимание, что XML-элемент в образце задается с помощью оператора пути (в данном случае BOOK/AUTHOR), который определяет местонахождение элемента в иерархии XML-документа. (Оператор пути походит на путь к файлу, который операционная система использует для указания местонахождения файла или папки.)

Главный момент, на который здесь следует обратить внимание, состоит в том, что оператор пути в значении атрибута select относится к текущему элементу. Каждый контекст внутри XSL-таблицы стилей относится к текущему элементу. Поскольку рассматриваемый пример шаблона относится к корневому элементу всего документа (посредством установки атрибута match=»/»), текущим «элементом» для данного шаблона является корневой элемент документа. (В данном случае текущий элемент не обладает соответствующим литералом, а является родителем элемента Документ.) Таким образом, внутри этого шаблона оператор пути BOOK/ AUTHOR указывает на элемент AUTHOR, вложенный в элемент BOOK, вложенный в корневой элемент документа. (Оператор пути в значении атрибута select аналогичен неполному пути к файлу, задающему местонахождение файла относительно текущей рабочей папки.)

Если вы опустите атрибут select для XSL-элемента value-of, элемент будет осуществлять вывод текстового содержимого плюс текстовое содержимое всех дочерних элементов в текущий элемент. (В нашем примере, поскольку текущим является корневой элемент, пропуск атрибута select приведет к выводу всех символьных данных в XML-документ.)

Целью представленного в рассматриваемом примере шаблона элементов является отображение текста названия для каждого из дочерних XML-элементов в документе (AUTHOR, TITLE, PRICE, BINDING и PAGES) плюс текстового содержимого каждого элемента. Обратите внимание, что порядок элементов value-of в шаблоне определяет порядок, в котором браузер отображает эти элементы. Таким образом, даже из этой простой таблицы стилей вы можете понять, что XSL-таблица стилей является более гибкой, чем CSS, которая всегда отображает элементы в том порядке, в котором они следуют в документе.

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

На рисунке на следующей странице показано как браузер генерирует первую часть блока HTML-разметки для документа и таблицы стилей из Листингов 10-1 и 10-2.

Ссылка. Для получения более подробной информации о работе с HTML и динамическим HTML (DHTML) в Internet Explorer 5, обратитесь к следующему Web-сайту, предоставленному MSDN: http://msdn.microsoft.com/workshop/author/default.asp. Если вы хотите познакомиться с официальной спецификацией HTML, обратитесь к следующему Web-сайту, предоставленному W3C: http://www.w3.org/TR/REC-html40/.

Отображение переменного числа элементов

В примере, рассмотренном в предыдущем разделе (см. Листинг 10-2), XML-документ содержал только один элемент BOOK. В случае, если документ содержит несколько элементов BOOK, методика, с которой вы познакомились в предыдущем разделе, способна отобразить только один из элементов. Возьмем, для примера, XML-документ, содержащий следующий элемент Документ:

Элемент xsl:if

Элемент позволяет задать проверку на соответствие определенному условию содержимое XML файла.

Чтобы задать проверку содержимого XML файла, нужно добавить элемент в XSL документ.

Синтаксис

Куда следует помещать элемент

Чтобы добавить проверку на соответствие какому-либо условию, следует добавить элемент внутри элемента в XSL файле:

Пример

Примечание: Значение обязательного атрибута test содержит проверочное выражение.

В соответствии с приведенным выше кодом выводится будут только те элементы title и artist, у которых элемент price имеет значение больше 10.

XSLT первый шаг

1. Введение

Не прошло и трёх лет с тех пор, как у меня зародилась мысль о том, что пора изучать XSLT -))). Мысль зародилась, а везде ещё стоял PHP 4 и зверствовал Salbotron , который, мягко говоря, не отличался высокой производительностью. Да и редко какой браузер мог похвастаться поддержкой этого самого XSLT. По этим соображениям изучение столь перспективного направления я отложил до лучших времён. На данный момент можно смело заявить, что эти времена настали, поскольку вышел PHP 5 с поддержкой XSLT и сносной объектной моделью, а все топовые браузеры уже сами уверенно держат преобразования, только подавай XML. :)

Важные ссылки по теме, первоисточники:

  • http://w3c.org — комитет по разработке и продвижению стандартов всемирной паутины Internet. На данный момент он является первоисточником практически всех веб-ориентированных стандартов и рекомендаций.
  • http://www.w3.org/TR/xml — спецификация расширяемого языка разметки XML, который является основой современного веба. На момент написания статьи доступна пятая редакция версии 1.0, а также вторая редакция версии 1.1.
  • http://www.w3.org/TR/xml-names — спецификация использования пространств имён в XML.
  • http://www.w3.org/TR/xpath — спецификация по использованию языка поиска частей XML-документа XPath.
  • http://www.w3.org/TR/xsl/ — спецификация расширенного языка стилей XSL.
  • http://www.w3.org/TR/xslt — спецификация языка преобразований XSLT.
  • http://validator.w3.org/ — валидатор HTML.
  • http://www.w3.org/TR/xhtml1/ — спецификация XHTML1.0.
Илон Маск рекомендует:  Что такое код printer_delete_pen

Переводы на русский язык:

Для лучшего понимания всего происходящего я рекомендую читать спецификации в следующем порядке:

  1. XML (это основа!)
  2. пространства имён (механизм разнородного XML-кода в одном файле)
  3. XPath (язык выборки элементов из дерева структуры)
  4. XSLT (преобразования)
  5. XHTML (то, к чему нужно стремиться)

Особо пытливые могут также уделить внимание расширенному языку стилей XSL.

2. Валидный XHTML

Что такое валидный XHTML? В первую очередь, это XML-документ, который должен соответствовать спецификации XML. Во-вторую, почти обычная HTML-страница, к которой все привыкли.

Почему нужен именно XHTML? Исключительно из соображений совместимости и кросс-браузерности. Страница в XHTML будет с большей вероятностью отображаться корректно в популярных браузерах, чем обычный HTML.

Для рядового клепателя страниц словосочетание XML-документ должно означать следующее:


  1. Документ содержит объявление XML-документа в самом начале страницы:
  2. Документ содержит один корневой элемент, в котором находятся все остальные.
  3. Все элементы (тэги) должны иметь закрывающую часть (
    ,

).

  • Атрибуты всегда имеют значение, которое обязательно указывается в кавычках (одинарных или двойных). Например, «radio» disabled= «disabled» /> .
  • Управляющие символы & , и > всегда должны маскироваться. Например, «?a=1&b=2» > & . Исключение составляет только , внутри которого спецсимволы можно не маскировать.
  • Также сам XHTML обязывает выполнять следующие условия:

    1. Документ должен объявлять пространство имён, в рамках которого будут использоваться элементы HTML.
    2. Документ должен объявлять DOCTYPE перед корневым элементом и указывать в нём один из типов XHTML и соответствующий DTD.

    Пример простого документа XHTML1.0:

    И так обо всём по порядку.

    Объявление XML-документа, в котором указывается его версия и кодировка.

    Для большей безопасности кодировку нужно всегда выставлять, иначе могут возникнуть проблемы с невалидными (по отношению к дефолтной кодировке) символами.

    Объявление типа документа и его схемы.

    Для XHTML 1.0 есть три типа — Strict (строгое соответствие рекомендациям W3C), Transitional (переходный тип) и Frameset (использование фреймов). Для каждого из них предусмотрен отдельный DTD.

    Объявление пространства имён и используемого языка.

    Очень важно указывать ссылку именно в таком регистре и никак иначе. Это связано с тем, что в XML имена элементов и содержимое их атрибутов регистрозависимы.

    Три версии XHTML1.0 предназначены для лучшей обратной совместимости:

    • Strict — обеспечивает наибольшее соответствие рекомендациям W3C со стороны браузеров. Однако и сам HTML-код должен следовать этим рекомендациям.
    • Transitional — менее строгое соответствие, которое заставляет браузер вести себя так, как если бы это был обычный HTML-документ.
    • Frameset — позволяет использовать фреймы.

    Помимо XHTML1.0 на данный момент доступен XHTML1.1:

    XHTML1.1 по сути является тем же XHTML1.0 Strict и призван вытеснить другие версии XHTML1.0. Однако, по сравнению с XHTML1.0 Strict, у него есть ряд отличий:

    1. Удалён атрибут lang , его роль выполняет xml:lang . (Модуль [ XHTMLMOD ])
    2. Для элементов a и map вместо атрибута name нужно использовать атрибут id . (Модуль [ XHTMLMOD ])
    3. Доступен набор элементов ruby . (Модуль [ RUBY ])

    Итак, если вам нужна наибольшая кросс-браузерность и совместимость с рекомендациями W3C, то XHTML1.1 самое оно!

    Из этих соображений результатом моих преобразований будет именно XHTML1.1.

    3. XSLT-преобразования

    Что такое XSLT? Это язык преобразований XML-документа, который был разработан как часть расширенного языка стилей (XSL).

    Зачем нужен XSLT? Он позволяет реализовать схему, при которой данные хранятся отдельно, а их представление отдельно. То есть, один XML-документ преобразуется с помощью другого XML-документа (XSL, в котором находятся XSLT-шаблоны) в конечный документ. Результатом может быть XML, HTML или текстовый документ любого формата.

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

    Валидным XSL-документом является XML-документ, у которого задано пространство имён xsl и присутствует корневой элемент stylesheet. В самом простом случае стиль может выглядеть, например, так:

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

    За подключение стиля отвечает строка:

    Если файлы text.xml и test.xsl созданы и находятся в одной папке, то с помощью любого XSLT-парсера можно преобразовать исходный test.xml в результирующий документ. В качестве парсера могут выступать все популярные браузеры (IE5+, FF2+, Opera9+ и другие), а также модули в языках программирования, например, в PHP. Если вы используете браузер, то достаточно открыть test.xml, и он сразу отобразит примерно такой результат:

    При этом кодировка результата будет UTF-8, несмотря на то, что исходный документ был сформирован в windows-1251. К сожалению, браузеры обычно не позволяют просмотреть код результирующего документа, но модуль XSLT в PHP5 даёт возможность передать результирующий код в переменную, которую можно сохранить в файл. Поэтому, используя PHP, я приведу исходный код результирующего документа:

    Этот код не является валидным XML-документом и тем более XHTML1.1. Для того, чтобы сформировать нужный код, я усложню исходный XSL-стиль и добавлю туда необходимые шаблоны и преобразования. При этом исходный XML-документ останется без изменений.

    В качестве примера я приведу XSL-стиль, который при помощи XSLT будет выводить список атрибутов исходного XML-документа с их значениями, при этом будет формироваться валидный XHTML1.1. Итак, стиль:

    Чтобы понять, как он работает, я распишу каждое действие отдельно:

    Документ сформирован в кодировке windows-1251, о чём сообщается в атрибуте encoding. Версию XML-документа желательно всегда указывать, это рекомендация W3C.

    Затем идёт объявление корневого элемента, стиля:

    Обязательным атрибутом является определение пространства имён xsl через атрибут xmlns:xsl= «http://www.w3.org/1999/XSL/Transform» .

    Следующим шагом в корневом элементе stylesheet объявляется, каким образом нужно формировать результирующий документ:

    • method= «xml» — метод вывода документа. Результирующий документ будет в формате XML.
    • encoding= «windows-1251» — кодировка результирующего документа.
    • omit-xml-declaration= «no» — пропускать или нет начальное объявление XML-документа ( ). Может иметь значение «yes» или «no» (актуально только для html).
    • indent= «yes» — формировать отступы согласно уровню вложенности. Может иметь значение «yes» или «no».
    • media-type= «text/xml» — MIME-тип результирующего документа (используется только для метода вывода html).
    • doctype-public= «-//W3C//DTD XHTML 1.1//EN» — тип результируюшего документа (DOCTYPE)
    • doctype-system= «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd» — ссылка на DTD

    Если метод вывода объявлен html, то значения атрибутов encoding и media-type будут подставлены в заголовок страницы ( . ) посредством метатега.

    Объявление основного шаблона:

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

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

    Формирование XHTML-страницы. Оно начинается с элемента , у которого указано пространство имён xhtml:

    Атрибут xmlns= «http://www.w3.org/1999/xhtml» указывает на пространство имён xhtml, которое будет применено по умолчанию к этому элементу и всем дочерним элементам, у которых оно не задано явно.

    Атрибут xml:lang= «ru» указывает на язык, в котором сформирована страница (будущая).

    Эта часть стиля была нужна для формирования атрибутики валидного XHTML1.1 кода.

    Теперь что касается XSLT-преобразований:

    Вставка простого текста:

    Текст «Мой список:» будет подставлен в тег

    Организация цикла по выборке:

    Атрибут select принимает выражение XPath, на основе которого делает выборку. Если выборка вернула список узлов, то начинает работать цикл по каждому элементу.

    В данном случае выборка вернёт список атрибутов для этого (корневого) и всех дочерних элементов.

    В данном случае проверяется на чётность позиция элемента в списке выборки. Если тест возвращает true (порядковый номер элемента чётный), то срабатывает содержимое этого элемента.

    Управление атрибутами вышестоящего элемента:

    В данном случае, если позиция элемента чётная (определяется вышестоящим if), то в стиль элемента
    будет прописан серый цвет фона.

    Вывод значений элемента:

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

    Вывод ссылки на разработчика парсера XSLT:

    Этот небольшой код XSLT формирует ссылку на разработчика парсера XSLT. Во многих случаях она будет разная и содержать разные значения.

    Результатом обработки этого стиля ( test.xsl ) станет такой код:

    Этот код соответствует стандарту XHTML1.1 и был сформирован на основе исходного XML-документа. Для проверки можно воспользоваться валидатором от W3C, который расположен по адресу http://validator.w3.org/.

    В браузере этот код выглядит примерно так:

    IE 6 FireFox 3 Opera 9.02

    4. Приложение

    Ссылки на исходный код

    Постоянный адрес статьи //anton-pribora.ru/articles/xml/xslt-first-step/. /Автор: Прибора Антон Николаевич, 2009 год/

    Использование PHP5 для обработки XSLT

    Для получения результирующего документа при помощи PHP5 я использовал такой код:

    Дополнительную информацию по использованию XSLT в PHP5 можно найти по адресу http://ru2.php.net/manual/ru/book.xslt.php.

    Мысли вслух

    «Товарищи, мы стоим на краю огромной пропасти! И я предлагаю сделать большой, решительный шаг вперёд!»


    © 2020 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.

    Способ: использование преобразований XSLT с файлами обмена данных XML проекта How to: Use XSLT Transformations with Project XML Data Interchange Files

    Таблица стилей преобразования (XSLT) standard указывает определение языка для преобразования XML-данных. The Extensible Stylesheet Language Transformation (XSLT) standard specifies a language definition for XML data transformations. XSLT используется для преобразования XML-документов в документы XHTML или в других XML-документов. XSLT is used to transform XML documents into XHTML documents, or into other XML documents. В этой статье показано, как использовать XSLT с помощью Microsoft Office Project 2007 XML обмена данными файлов для фильтрации и отображения сведений о проекте. This article shows you how to use XSLT with Microsoft Office Project 2007 XML Data Interchange files to filter and display project information. (Сведения в этой статье был предоставили Джессика Britton корпорации Майкрософт.) (The content of this article was contributed by Jessica Britton, Microsoft Corporation.)

    Сведения о сохранении проекты в виде обмена данными Project XML-файлов можно Сохранение и открытие проектов в формате XML. For information about saving projects as Project XML Data Interchange files, see Saving and Opening Projects in XML Format.

    Таблицы стилей XSLT — это XML-документ, состоит из комбинации XHTML разметки, правила шаблона XSLT и XPath операторов, которые работают вместе. An XSLT stylesheet is an XML document that consists of a combination of XHTML markup, XSLT template rules, and XPath statements that work together.

    Разметка XHTML определяет среды отображения, представленных в XML-данных. XHTML markup defines the display environment that XML data is presented in.

    Правила шаблона XSLT предоставлены инструкции для преобразования XML-элемент источника определенным образом. XSLT template rules provide instructions for transforming a source XML element in a particular way.

    Операторы XPath определите определенных элементов XML-документа. XPath statements identify specific elements within an XML document.

    При XML-элемент соответствует шаблону XPath, вызывается связанного шаблона правила преобразования XSLT. When an XML element matches an XPath pattern, the associated XSLT template rule is invoked. Преобразованные данные выводятся в платформе отображения, указанный с помощью разметки XHTML. The transformed data is then rendered in the display framework specified by the XHTML markup.

    Дополнительные сведения о правилах шаблон XSLT и XPath операторов воспользуйтесь ссылками в конце этой статьи. For more information about XSLT template rules and XPath statements, see the links at the end of this article.

    Отображение сведений о проекте с помощью XSL-преобразований Displaying Project Information by using XSLT Transformations

    Процедура 1. Procedure 1. Чтобы создать таблицу стилей XSLT: To create an XSLT stylesheet:

    Создание файла XSLT для вашей таблицы стилей. Create an XSLT file for your stylesheet. При работе в Microsoft Visual Studio 2005 можно использовать шаблон XSLT-файл (в Visual Studio откройте меню файлвыберите команду Создатьи выберите пункт файл. If you are working in Microsoft Visual Studio 2005, you can use the XSLT File template (in Visual Studio, click File, point to New, and then click File. Этот шаблон предварительно заполняется в XML-коде показано в следующем примере. This template is prepopulated with the XML code shown in the following example. Если вы работаете в качестве другого текстового или XML-редактора, скопируйте этот шаблон XML и вставьте его в XSLT-файл. If you are working in another text or XML editor, copy this template XML and then paste it into your XSLT file.

    Удалите следующий XML-код комментарии. Delete the following XML code comment. Здесь указывается, где написании кода XSLT. This is where you write your XSLT code.

    Создание кода XSLT. Create your XSLT code. Код XSLT, показано в следующем примере выполняет следующие действия. The XSLT code shown in this example does the following:

    Отображает текстовое значение имя дочернего элемента проекта в заголовок. Displays the text value of the Name child of the Project element in a header.

    Проверяет сводки дочерним элементом каждой задачи для просмотра, если значение равно 0 (false). Tests the Summary child of each Task element to see if the value is 0 (false).

    Проверка важных дочерних каждого элемента задачи для просмотра, если значение равно 1 (true). Tests the Critical child of each Task element to see if the value is 1 (true).

    Отображает данные для особо важные задачи, которые не являются суммарными задачами полужирным шрифтом. Displays data for critical tasks that are not summary tasks in bold.

    Отображает данные для некритические задачи, которые не являются суммарными задачами. Displays data for noncritical tasks that are not summary tasks.

    Сортировка сведения о ресурсах по текстовое значение дочернего имя для каждого элемента ресурсов. Sorts resource information alphabetically by the text value of the Name child of each Resource element.

    Проверяет дочернего превышение доступности для каждого элемента ресурсов является ли значение 1 (true). Tests the Overallocated child of each Resource element to see if the value is 1 (true).

    Отображение сортированных ресурсе только с превышением доступности ресурсов. Displays sorted resource data for only overallocated resources.

    Сохраните файл как ProjectTransform.xslt. Save the file as ProjectTransform.xslt.

    После создания таблицы стилей XSLT, необходимо связать файл XML для проекта к нему, добавив инструкции по обработке. After you create the XSLT stylesheet, you must link your Project XML file to it by adding processing instructions. Процедура 2 показано, как связать ProjectTransform.xslt файл, созданный в процедуру 1 для всех файлов XML для проекта. Procedure 2 shows you how to link the ProjectTransform.xslt file created in Procedure 1 to any Project XML file.

    Процедура 2. Procedure 2. Чтобы изменить файл XML для проекта для использования таблицы стилей XSLT: To modify the Project XML file to use the XSLT stylesheet:

    Откройте файл XML для проекта в Visual Studio или в другом текстовом редакторе или редакторе XML. Open a Project XML file in Visual Studio, or in another text or XML editor.

    Вставьте следующую строку кода после объявления XML — это первая строка в проект XML-файл. Insert the following line of code after the XML declaration, which is the first line in the Project XML file.

    Удалите объявление пространства имен XML из внутри элемента проекта, который представляет собой корневой элемент проекта XML-файла. Delete the XML namespace declaration from inside the Project element, which is the root element of the Project XML file. Если не удаляйте объявление пространства имен, встроенного в элемент проекта, операторы XPath завершится с ошибкой в соответствии с элементами в проект XML-файл. If you do not delete the namespace declaration that is embedded in the Project element, XPath statements will fail to match elements in the Project XML file.

    После выполнения действия 2 и 3, первые три строки проект XML-файл должен выглядеть как в следующем примере кода. After you perform Steps 2 and 3, the first three lines of your Project XML file should look like the following code example.

    Сохраните файл XML для проекта. Save the Project XML file.

    Мы рекомендуем сохраните файл с именем файла, отличный от исходное имя файла XML для проекта, так как изменения, внесенные в шаге 3 разорвать связь проекта XML-файла из проекта данных Interchange схемы XML. We recommend you save the file by using a file name that is different from the original Project XML file name, because the changes made in Step 3 disassociate the Project XML file from the Project XML Data Interchange Schema.

    Просмотр преобразованный файл XML для проекта. View the transformed Project XML file. Можно выполнить преобразования XSLT в Visual Studio, установив таблицы стилей проекта XML-файла для ProjectTransform.xslt и затем выбрав команду Показать вывод XSLT в меню XML . You can perform the XSLT transformation in Visual Studio by setting the Stylesheet property of the Project XML file to ProjectTransform.xslt, and then selecting Show XSLT Output from the XML menu.

    Можно также открыть проект XML-файл в Internet Explorer 7, Microsoft Office Word 2007 или любого другого приложения, поддерживающего XSLT. You can also open the Project XML file in Internet Explorer 7, Microsoft Office Word 2007, or any other application that supports XSLT.

    На рисунке 1 показано преобразованные выходные данные проекта XML-файла в Word 2007. Figure 1 shows the transformed output of a Project XML file in Word 2007. При открытии файла XML для проекта по умолчанию только данные представления данных отображается. When you open the Project XML file, by default the Data only data view is displayed. Чтобы просмотреть преобразованные выходные данные необходимо выбрать представление данных ProjectTransform.xslt в области XML-документа . To see the transformed output you must select the ProjectTransform.xslt data view in the XML Document pane.

    Рис. 1. Figure 1. XML-файл преобразованного проекта Transformed Project XML file

    1.9. Отображение XML-документов с использованием XSL-таблиц стилей

    XSL-таблица стилей – более мощный и гибкий инструмент для отображения XML-документов, нежели CSS-таблица. Используя XSL-таблицы стилей, вы можете не только задать формат для каждого элемента XML, как при CSS-таблице, но и обеспечить средства контроля над выводимыми данными.

    XSL позволяет выбрать те данные XML, которые вы хотите отобразить, представить эти данные в любом порядке, свободно модифицировать или добавлять информацию. XSL предоставляет вам доступ ко всем компонентам XML (элементам, атрибутам, комментариям и инструкциям по обработке).

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

    Базовая форма XSL-таблицы стилей избирательно преобразует XML-документ в HTML-страницу, воспринимаемую и отображаемую браузером. Получая доступ к богатому арсеналу HTML, вы к методам преобразования XSL добавляете новые возможности по форматированию и обработке данных.

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

    XSL базируется на XML, благодаря чему XSL более гибок и универсален. У разработчиков имеется возможность использовать средства контроля за корректностью составления стилевых списков (используя схемы XML).

    С помощью XSL можно преобразовать XML-документ в формат HTML, WML, RTF, PDF, SQL, SWF, а также в другой XML и XSL-документы. XSL указывает, как будет оформлен документ, где и каким образом должны размещаться данные.

    Спецификация XSL состоит из трех частей:

    — XSLT ( XSL Transformations ) – язык для преобразования XML ;

    — XPath – язык путей и выражений, используемый в XSLT для доступа к отдельным частям XML-документа;

    — XSL-FO ( XSL Formatting Objects ) – язык для верстки XML.

    Существуют два основных шага для отображения XML-документа при использовании XSL-таблицы стилей.

    1. Создание файла XSL-таблицы стилей.

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

    2. Связывание XSL-таблицы стилей с XML-документом.

    Вы можете связать XSL-таблицу стилей с XML-документом, включив в документ инструкцию по обработке xml-stylesheet , которая имеет следующую обобщенную форму записи:

    — stylesheet type=»text/ xsl » href = XSLFilePath ?>

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

    Вы можете использовать полный URL, например:

    — stylesheet type=»text/ xsl » href =»http:/www.my_domain.com/Inventory.xsl»?>

    Чаще используют неполный URL, который задает местонахождение относительно месторасположения XML-документа, содержащего инструкцию по обработке xml — stylesheet , например:

    — stylesheet type=»text/ xsl » href =»Inventory.xsl»?>

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

    Обычно инструкция по обработке xml — stylesheet добавляется в пролог XML-документа вслед за объявлением XML.

    Если вы связали XSL-таблицу стилей с XML-документом, вы можете открыть этот документ непосредственно в Internet Explorer , при этом браузер отобразит XML-документ с использованием инструкций по преобразованию содержащихся в таблице стилей. В отличие от каскадных таблиц стилей, если вы связываете с XML-документом более одной XSL-таблицы стилей, браузер использует первую таблицу и игнорирует все остальные. Если вы свяжете с XML-документом и CSS-таблицу, и XSL-таблицу стилей, браузер использует только XSL-таблицу стилей.

    Корневым элементом, указывающим на то, что документ является XSL-таблицей стилей, является:

    или полностью равноценный ему

    В соответствии с W3C XSLT-Рекомендацией корректный способ объявления таблицы стилей XSL выглядит следующим образом:

    xsl:stylesheet version=»1.0″ xmlns:xsl =»http://www.w3.org/1999/XSL/Transform»>

    xsl:transform version=«1.0» xmlns:xsl =»http://www.w3.org/1999/XSL/Transform»>

    Для того чтобы XSLT-элементы, атрибуты и характеристики были доступны в начале документа, необходимо объявить пространство имен XSLT:

    Оно указывает на официальное пространство имен W3C XSLT. При этом также следует указать атрибут version= » 1.0«.

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

    Элемент xsl : stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов, которые для краткости будем называть шаблонами. Элемент может содержать только один шаблон, который имеет следующую форму:

    Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым вы связываете таблицу стилей.

    Атрибут match шаблона указывает на определенную ветвь. Атрибут match аналогичен селектору в правиле CSS. Значение атрибута match носит название образца ( pattern ). Образец в данном примере («/») представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, содержит инструкции для отображения всего XML-документа.

    Каждая XSL-таблица стилей должна содержать один и только один шаблон с атрибутом match , который имеет значение «/». Вы также можете включить один или несколько дополнительных шаблонов с инструкциями для отображения определенных подчиненных ветвей в структуре XML-документа; каждая из них должна иметь образец, отвечающий определенной ветви.

    Шаблон содержит два вида XML-элементов.

    1. XML-элементы, представляющие HTML-разметку. Примерами подобного вида XML-элемента из таблицы стилей являются:

    Описание книги

    Этот элемент отображает заголовок второго уровня,


    а тот, в свою очередь, отображает блок текста, набранного курсивом.

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

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

    2. XSL-элементы. Примерами XSL-элементов являются элементы xsl:value-of :

    xsl:value -of select=»BOOK/AUTHOR»/>

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

    XSL-элемент value-of добавляет текстовое содержимое определенного XML-элемента в выходной модуль HTML, который воспринимается и отображается браузером. Вы указываете определенный XML-элемент заданием образца, который присваиваете атрибуту select XSL-элемента value-of .

    В рассмотренном выше примере элемента value-of атрибуту select присвоен образец BOOK/AUTHOR, что приводит к выводу текстового содержимого элемента AUTHOR XML-документа.

    Обратите внимание, что XML-элемент в образце задается с помощью оператора пути (в данном случае BOOK/AUTHOR), который определяет местонахождение элемента в иерархии XML-документа. (Оператор пути аналогичен пути к файлу, который операционная система использует для указания местонахождения файла или папки.)

    Главный момент, на который здесь следует обратить внимание, состоит в том, что оператор пути в значении атрибута SELECT относится к текущему элементу. Каждый контекст внутри XSL-таблицы стилей относится к текущему элементу. Поскольку рассматриваемый пример шаблона относится к корневому элементу всего документа (посредством установки атрибута match= «/»), текущим «элементом» для данного шаблона является корневой элемент документа. Таким образом, внутри этого шаблона оператор пути BOOK/AUTHOR указывает на элемент AUTHOR, вложенный в элемент BOOK, вложенный в корневой элемент документа. (Оператор пути в значении атрибута SELECT аналогичен неполному пути к файлу, задающему местонахождение файла относительно текущей рабочей папки.)

    Если вы опустите атрибут SELECT для XSL-элемента value-of , элемент будет осуществлять вывод текстового содержимого плюс текстовое содержимое всех дочерних элементов текущего элемента.

    Пример 10. Вывод информации XML -файла с использованием одного шаблона XSL (рис. 1.7):

    — stylesheet type=»text/ xsl » href =» Пример 10.xsl» ? >

    Элемент

    При помощи элемента осуществляются проверки условия и принимаются действия на основе результата проверки. Он во многом похож на оператор if в языках программирования. У элемента один атрибут:

    • test (обязательный). Устанавливается в значение логического ( Boolean , true/false ) условия, которое вы хотите проверить.

    Элемент заключает в себе тело шаблона.

    Вот как это работает: вы включаете тело шаблона внутрь элемента , проверяющего какое-то выражение. Если это выражение истинно, тело шаблона используется, если ложно — игнорируется:

    Можно проверять любое выражение XPath. Для преобразования его в значения true/false в элементе применяйте следующие правила:

    • если выражение вычисляется в набор узлов, оно трактуется как true , когда набор узлов содержит хотя бы один узел;

    • выражение-строка считается true , если строка не пуста;

    • фрагмент результирующего дерева трактуется как true , если содержит узлы;

    • если результат выражения — число, он считается true , когда отличен от нуля.

    Элемент во многом похож на оператор if-then в языках программирования. Однако не существует оператора для формирования конструкций if-then-else — для этого служит элемент .

    XML-таблица HTML с XSLT

    Мне нужно иметь возможность превращать плоские массивы данных xml в html-таблицы, и мне трудно найти примеры синтаксиса, которые будут соответствовать моим потребностям. Я хотел бы использовать одну таблицу стилей, которая может конвертировать похожие поисковые массивы в html-таблицы с переменными столбцами. Это означает, что он не может использовать имена жестко закодированных элементов, кроме «строк» ​​и «строки».

    Таблица стилей, в которой я буду, сможет конвертировать:

    У меня было желание попытаться решить это вскоре после публикации вопроса, и вот что я придумал. Я думаю, это заставляет вас ждать 24 часа, прежде чем вы сможете сами ответить.

    Прямое и короткое решение:

    при применении к первому предоставленному XML-документу:

    выдается желаемый, правильный результат:

    при применении ко второму предоставленному XML-документу:

    снова получается желаемый, правильный результат:

    Методическое пособие по курсу «Язык разметки xml. Часть 1» Методическое пособие для студентов специальности «Компьютерные системы и сети»

    Стилевые таблицы XSL, Переменные и параметры

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

    • Переменная — это имя, присвоенное ячейке памяти или ячейкам, которые могут содержать представление конкретного типа данных
    • Значение переменной может изменяться в процессе выполнения программы.

    С точки зрения логической модели преобразования, такие технические детали, как адрес переменной в памяти, нас не интересуют, хотя он несомненно существует. Гораздо более удобным является другое определение:

    • Переменная — это объект определенного типа, с которым связанно имя

    По этому имени мы можем обращаться к объекту, использовать его значение и т.д. Иными словами, в XSLT под переменной понимается не более чем ассоциация между значением и именем, и если мы скажем, что переменная x имеет значение 5, это будет означать, что имя «x» связанно с объектом численного типа, значение которого равно 5.

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

    В XSLT объявление переменной есть создание ассоциации между объектом и именем.
    ^

    Элемент xsl:variable

    Элемент xsl:variable в XSLT используется для связи имени переменной, указанного атрибутом name со значением. Значение переменной может быть полученно вычислением выражения, заднного необязательным атрибутом select или выполнением шаблона в содержимом элемента. Использовать объявленную таким образом переменную можно, указывая перед именем символ $:

    Переменные XSLT могут быть глобальными и локальными. Если элемент xsl:variable является элементом верхнего уровня, то переменная будет глобальной; если элемент xsl:variable объявлен внутри шаблонного правила — локальной.

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

    Локальную переменную можно использовать только после объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. Если существует одноименная глобальная переменноя, то локальная переменная в своей области видимости перекрывает ее. Имена локальных переменных могут совпадать, если их области видимости не пересекаются.
    ^

    Использование переменных

    Как правило, первой реакцией на известие о том, что переменные в XSLT нельзя изменять является реплика: «Да зачем они вообще тогда нужны?». Претензия со стороны процедурного программирования вполне серьезнаа и обоснованна — изменяемые переменные являютсся неотъемлимой частью сложных многошаговых вычислений. Тем не менее, переменные, даже в таком виде, в каком они присутсвуют в XSLT, являются очень важным и полезным элементом языка. Ниже перечислены наиболее типичные случаи использования переменных:

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

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

    Попробуем разобраться на примерах.

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

    Гораздо удобнее и экономней с точки зрения вычислительных ресурсов объявить переменную вида

    и использовать ее в преобразовании как $links. Например:

    . количество ссылок в документе:

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

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

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

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

    если условие1 то

    присвоить переменной1 значение1

    присвоить переменной1 значение2

    В традиционном языке программирования с изменяемыми переменными (например C++ или Javascript) это выглядело бы так:

    или в чуть более широком варианте:

    if (условие1) переменная1=значение1

    Однако если в XSLT написать что нибудь подобное

    то требуемого результата все равно не достигли бы по той причине, что переменная будет иметь в этом случае локальную область видимости, ограниченную элементом xsl:when или xsl:otherwise и их дочерними элементами. Правильный шаблон для решения этой задачи выглядит следующим образом:

    Конечно, это не то же самое — на самом деле мы получаем не само значение, а дерево, содержащее это значение, но для строковых и численных значений особой разницы нет: дерево будет вести себя так, как будто это число или строка (см. правила приведения типов в одном из предыдущих уроков).

    Параметры

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

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

    Работа с параметрами обеспечивается двумя элементами XSLT:

    xsl:param — служит для объявления параметра;

    xsl:with-param — указывает значение параметра ри вызове шаблона.

    xsl:param

    Синтаксис этого элемента следующий:

    Элемент xsl:template, задающий в преобразовании шаблонное правило, может включать несколько элементов xsl:param, которые и будут определять параметры этого шаблона. Кроме того, xsl:param может быть элементов верхнего уровня — в этом случае объявляемый параметр будет глобальным.

    Атрибут name задает имя параметра. Имя параметра может имет расширенную форму, например «user:param», однако, чтобы не возиться с пространствами имен, на практике всегда используют простые имена: «i», «count» или что-то в этом роде.

    Параметру может быть присвоенно эначение по умолчанию.Это значение будет использованно с том случае, если параметра с таким именем шаблону при вызове переданно не было. Значение по умолчанию вычисляется следующим образом:


    если в элементе xsl:param определен атрибут select, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте. Пример:

    если атрибут select не определен, носам элемент xsl:param содержит дочерние узлы, то значением параметра по умолчанию будет фрагмент дерева, полученный в результате выполнения содержимого xsl:param. Пример:

    в результате будет получен фрагмент дерева

    состоящий из корневого узла и текстового узла «4»

    если атрибут select не определен и сам элемент xsl:param не содержит дочерних элементов, то значением по умолчанию будет пустая строка. Пример:

    Область видимости параметра определяется так же как область видимости переменной. Единственное, что нужно запомнить — это то, что элементы xsl:param, определяемые в шаблонах, должны всегда быть его первыми дочерними элементами. Абсолютно логично и то, что в одном шаблоне не может быть объявленно 2 или более одноименных параметра, так как их области видимости обязательно будут пересекаться.

    xsl:with-param

    Синтаксис xsl:with-param абсолютно идентичен синтаксису xsl:param и отличаются они только именем. Практически настолько же похоже и их действие, только элемент xsl:with-param связывает параметр со значением, которое при вызове шаблона будет использоваться вместо значения параметра по умолчанию. Таким образом, значение параметра, заданного в шаблоне, выбирается следующим образом:

    • если в элементе, который вызывает этот шаблон, присутствует элемент xsl:with-param, передающий значение этого параметра, то в шаблоне будет использоваться переданное значение;
    • в противном случае будет использоваться значение по умолчанию.

    Продемонстрируем теперь использование более интересных функций — start-with(string,startSubstring) и contains(string,anySubstring). Функция start-with(string,startSubstring) проверяет, начинается ли строка string с подстроки startSubstring. Пример — ex04-4.xml, ex04-4.xsl.

    Синтаксис элемента xsl:if.

    В этом элементе мы использовали переменные. Значения переменных были инициализированы ранее

    Переменная varStartWith представляет собой подстроку, с которой должны начинаться требуемые нам марки. Она не меняется, поэтому инициализируется перед циклом. Переменная varCarMarka содержит марку автомобиля, она меняется на каждом шаге цикла и, соответственно, инициализируется в теле цикла. Элемент letter XML-файла содержит букву «М».

    Функция contains(string,anySubstring) проверяет, содержит ли строка string подстроку anySubstring. Пример — ex04-5.xml, ex04-5.xsl.

    Синтаксис элемента xsl:if.

    Этот пример полностью аналогичен предыдущему. Элемент letter XML-файла содержит букву «Ш».

    Два элемента xsl:if, вложенные друг в друга, дают нам эффект оператора AND (ex04-6.xml, ex04-6.xsl).

    XSLT условное включение внешнего файла

    Я хочу выполнить условное включение в XSLT, но xsl: include является элементом верхнего уровня. Вы можете использовать только xsl: if или xsl: выбрать внутри шаблона. Есть ли какой-либо хак или работа вокруг, которая позволяет условно включать внешний файл? Я попытался использовать функцию document(), но мне не удалось загрузить мой внешний файл (возможно, потому, что он не соответствует некоторому набору правил, который сделает его «действительным»).

    My external xml file — это куча фрагментов кода xslt. в зависимости от значения переменной в главном файле XSLT, код-код из внешнего файла должен быть «скопирован/вставлен» на место (например, условное включение на C или PHP).

    Поток моего основного файла XSLT должен действовать следующим образом:

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

    Создан 24 янв. 12 2012-01-24 17:23:49 Roy Jons

    8 ответов

    Как я понимаю, «включение» происходит, когда синтаксический анализатор xml анализирует и компилирует таблицу стилей. Это означает, что никакая логика или оценка выражения не могут произойти до того, как включается обработка, и поэтому нет возможности сделать ее условной как таковой. Вам необходимо сделать условное поведение за пределами таблицы стилей.

    В частности, делает этот комментарий Майк Кэй помощью:

    Это был поднят несколько раз. В предыдущем потоке мы пришли к выводу, что пользователь пытался написать таблицу стилей общего назначения G, а затем специализировать ее, условно включив таблицу стилей A или B.. Способ удовлетворения этого требования: A и B включают G, а не наоборот, а затем вы условно выбираете A или B в качестве основной таблицы стилей при запуске преобразования.

    Создан 24 янв. 12 2012-01-24 19:33:40 Kevan

    Это не может быть сделано с помощью XSLT 1.0 и может быть сделано (в очень ограниченной степени) в XSLT 2.0, используя атрибут use-when .

    Существует не-xslt способ достижения желаемого динамического изменения xsl:include или директивы xsl:import .

    Одним из таких способов является, чтобы загрузить таблицу стилей XSLT в качестве XmlDocument, и используя доступные методы DOM для доступа к и изменения атрибутов, чтобы установить атрибут на нужное значение href . Затем инициируйте преобразование из этой модифицированной XMLDocument таблицы стилей XSLT, модифицированной в памяти.

    Создан 25 янв. 12 2012-01-25 03:57:20 Dimitre Novatchev

    Попробуйте инвертировать структуру: если у вас есть два специальных модуля pink.xsl и blue.xsl, а также универсальный модуль baby.xsl, то вместо того, чтобы пытаться импортировать/включать один из pink.xsl или blue. xsl в baby.xsl, вместо этого используйте pink.xsl или blue.xsl в качестве таблицы стилей верхнего уровня, и каждый из этих двух import baby.xsl. Именно так оно и предназначалось для использования, это не хак или обходной путь.

    В качестве альтернативы, учитывая это описание вашего сценария «Мой внешний XML-файл представляет собой кучу фрагментов кода xslt», лучшим вариантом в вашем случае может быть сборка стилей из этих фрагментов в виде отдельного шага с использованием преобразования XSLT вместо использования xsl: include/xsl: import.

    Создан 25 янв. 12 2012-01-25 08:40:19 Michael Kay

    В дополнение к уже сказанному возможным решением было бы сделать дополнительные файлы доступными для XML-файлов, а не XSLT-файлов. Таким образом, вы можете включить их с помощью функции XPath document() (которая будет оцениваться во время выполнения, а не во время компиляции).

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

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

    Если у вас возникли проблемы с document() , используйте XML-валидатор в своих файлах. Ошибка означает, что ваши файлы недействительны XML.

    Создан 25 янв. 12 2012-01-25 10:58:19 flyx

    В этом примере я сделал условное использование внешнего файла. У меня был флаг в базовом XML, который XSL использует как переменную, чтобы указать имя другого файла для втягивания в шаблон. Как только эта переменная определена, как в моем случае, я использую ее, чтобы вытащить другие данные XML в сгенерированный вывод. Команда concat объединяет данные для получения имени файла.

    Поэтому, когда я хочу получить информацию из внешнего XML-файла, я использую ‘$ DOCUMENTNAME’ для ссылки на внешние данные.

    Создан 21 май. 13 2013-05-21 18:26:54 Martel

    Не уверен, что это применимо к вашему сценарию, но я все равно его выброшу.

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

    Например, скажем, файл XSLT «родитель» называется root.xslt, и два условно используемые из них являются child1.xslt и child2.xslt. Скажем, я хочу запустить условную логику относительно значения узла с именем status. Если значение «CURRENT», я хочу вызвать шаблон с именем isCurrent в child1.xslt, иначе вызвать шаблон с именем isNotCurrent в child2.xslt. Для краткости в каждом случае я просто передаю шаблон корневому узлу и всем дочерним элементам.

    Был бы выглядеть примерно так:

    Надеется, что это, по крайней мере помогает немного.

    Создан 16 июн. 14 2014-06-16 20:44:55 Eric Stallcup

    С добавлением static parameters, это теперь возможно в XSLT 3.0.Статические параметры могут использоваться в атрибуте use-when xsl:include .

    Теперь мы можем объявить параметры со значениями по умолчанию false() , а затем переопределить те, которые мы должны во время выполнения .

    Вот полный рабочий пример протестирован с Saxon-HE V9.7 (также протестирован с Saxon-PE 9.5).

    XML-вход (test.xml)

    Главная XSLT 3.0 (test_main.xsl)

    Первый вариант включен в XSLT 3.0 (test_inc1.xsl)

    Второй вариант включен XSLT 3.0 (test_inc2.xsl)

    Командная строка (настройка inc2 истина)

    Выход

    Создан 01 мар. 17 2020-03-01 18:22:56 Daniel Haley

    Eсть один из подходов, который я нашел условно, включает файлы с использованием функции use-when в XSLT 2.0.

    Вы должны создать одну систему собственности, которая передается через Заявку во время выполнения, как в моем случае, я использую Java, так что я создал свойство «Debug», используя команду для запуска моего приложения:

    то в XSLT это свойство используется для включения условных файлов. Например

    Не знаю, подходит ли он для заданного сценария, но ДА есть способ сделать это в XSLT 2.0. В XSLT 3.0 также добавлена ​​поддержка локальной переменной. Поэтому это можно легко сделать с помощью локальных переменных.

    Спасибо, Счастливый Coding

    Создан 08 дек. 17 2020-12-08 13:02:48 Vivek

    Элемент xsl:if улучшение внешнего вида таблиц / xml xslt

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

    Для начинающих и профессиональных программистов

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

    Элемент xsl:if

    Разделы на этой странице:

    Синтаксис элемента следующий:

    Элемент xsl:if является простейшим условным оператором в XSLT. Выражение, содержащееся в обязательном атрибуте test , вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значение true , процессор выполняет шаблон, содержащийся в xsl:if .

    Вследствие того, что атрибуты в XML не могут содержать некоторые специальные символы (такие как » » и » & «), их необходимо заменять символьными сущностями. В особенности это касается сравнения чисел типа «меньше»; объявление вида

    будет с точки зрения синтаксиса XML некорректным. Вместо него следует использовать эквивалентное объявление

    Следует заметить, что символ «больше» (» > «) заменять сущностью необязательно. Однако из соображений единообразия принято заменять и его.

    Пример

    Предположим, мы преобразовываем список названий

    во фрагмент HTML-кода, в котором каждый элемент item должен быть преобразован в соответствующий элемент option , а значение, выбранное во входящем документе атрибутом active элемента list , должно быть помечено булевым атрибутом selected .

    Илон Маск рекомендует:  Postgres95 архитектура субд postgres95
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL