Как связать xml и xsl

Обновлено: 22.04.2024

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

Свойство Вывод определяет имя выходного файла. Если свойство Вывод пустое, файл с указанным именем создается во временном каталоге. Расширение файла определяется на основе элемента xsl:output в таблице стилей. Это может быть XML, TXT или HTM.

Если свойство Вывод определяет имя файла с расширением HTM или HTML, вывод XSLT открывается для предварительного просмотра с помощью браузера. Файлы с другими расширениями открываются редактором по умолчанию, которые выбирает среда Visual Studio. Например, если файл имеет расширение XML, то в Visual Studio используется редактор XML.

Выполнение преобразования XSLT из XML-файла

Откройте XML-документ в редакторе XML.

Свяжите таблицу стилей XSLT с XML-документом.

Добавьте в XML-документ инструкцию по обработке xml-stylesheet . Например, добавьте в пролог документа следующую строку: .

Добавьте таблицу стилей XSLT с помощью окна Свойства. Открыв файл XML в редакторе, щелкните правой кнопкой мыши в любом месте редактора и выберите Свойства. В окне Свойства щелкните поле Таблица стилей и нажмите кнопку обзора (. ). Выберите таблицу стилей XSLT, а затем нажмите Открыть.

В строке меню щелкните XML > Запустить XSLT без отладки. Либо нажмите клавиши CTRL+ALT+F5.

Результат XSLT-преобразования отображается в новом окне документа.

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

Выполнение преобразования XSLT из таблицы стилей XSLT

Откройте таблицу стилей XSLT в редакторе XML.

Укажите XML-документ в поле Ввод в окне Свойства документа.

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

В строке меню щелкните XML > Запустить XSLT без отладки. Либо нажмите клавиши CTRL+ALT+F5.

Результат XSLT-преобразования отображается в новом окне документа.

Задание имени выходного файла

У имени выходного файла может быть расширение XML или XS. Откройте окно Свойства и укажите имя файла в поле Вывод.

В предыдущем разделе для вывода элементов XML- документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства - стилевых таблиц XSL(Extensible Stylesheet Language).

Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы(CSS- Cascading Style Sheets [7]) уже больше года используются Web- разработчиками для оформления Web- страниц. Поддержка CSS наиболее известными на сегодняшний день броузерами Netscape Navigator(начиная с версии 4.0) и Microsoft Explorer(начиная с версии 3.0), позволила использовать стилевые таблицы для решения самого широкого спектра задач - от оформления домашней странички до создания крупного корпоративного Web-узла. Слово каскадные в определении CSS означает возможность объединения отдельных элементов форматирования путем вложенных описаний стиля. Например, атрибуты текста, заданные в тэге , будут распространяться на вложенные тэги до тех пор, пока в них не встретятся стилевые описания, отменяющие или дополняющие текущие параметры. Таким образом, использование таблиц CSS в HTML было весьма эффективно - отпадала необходимость явного задания тэгов форматирования для каждого из элементов документа.

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

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

Некоторые его отличия от CSS:
Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования.
Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)
В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить "каскадируемость" стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования

В настоящий момент язык XSL находится на стадии разработки в W3C[3] и в будущем, видимо, станет частью стандарта XML. Это означает, что использование этого механизма является наиболее перспективным способом оформления XML- документов. В текущем рабочем варианте W3C, XSL рассматривается не только как язык разметки, определяющий стилевые таблицы - в него заложены средства, необходимые для выполнения действий по фильтрации информации, выводимой в окно клиента, поиска элементов, сложного поиска, основанного на зависимостях между элементами и т.д. На сегодняшний день единственным броузером, поддерживающим некоторые из этих возможностей, является бэта-версия Internet Explorer 5.0, однако в самом ближайшем будущем, безусловно, XSL будет использоваться также широко, как сегодня стандартные тэги HTML

В этом разделе мы рассмотрим упрощенную объектную модель XSL- документа, используемую в текущей версии XSL-конвертора Microsoft msxsl, и поэтому информацию, изложенную далее, нельзя считать описанием стандарта языка. Полный рабочий вариант спецификации XSL в последней его редакции доступен на сервере [3].

С чего начать

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

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

Структура XSL- таблиц

Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе msxsl, для создания оформления XML-документов.

Правила XSL

Вот пример простейшего XSL-документа, определяющего форматирование для фрагмента rose :

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

Инструкция указывает на то, что данное правило определяет элемент. Параметром type="flower" задается название XML-элемента, для которого будет использоваться это правило. Программа-конвертор будет использовать HTML-тэги, помещенные внутри блока для форматирования XML-элемента, которому "предназначался" текущий блок. В том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например, )

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

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

Ниже приведен пример более сложного XSL- описания, некоторые фрагменты которого будут пояснены позже.

Корневое правило

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

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

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

Отношения между элементами

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

Как видно из примера, если в XML- документе будет найден элемент , являющийся дочерним по отношению к элементу (название статьи), то его форматирование будет несколько отличаться от элемента , расположенного внутри тэгов

Приоритеты правил

В том случае, если внутри XSL- документа встречается несколько правил для одного и того же элемента, то msxsl будет использовать то из них, которое более точно определяет позицию данного элемента. Т.е. если XSL- документ содержит следующие правила:

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

  • правила, помеченные специальным тэгом
  • правила с наибольшим значением атрибута id, если он определен
  • правила с наибольшим значением атрибута class, если он определен
  • правила, имеющие наибольшую вложенность, определяемую тэгом
  • правила, использующие атрибут type совместно с
  • правила, в которых отсутствует атрибут type в или
  • правила с более высоким приоритетом, задаваемым атрибутом priority тэга
  • правила с наибольшим значением квалификаторов , ,

Использование атрибутов элементов

Фильтрация элементов

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

Элемент сам по себе не определяет шаблон форматирования, он лишь управляет работой анализатора, обозначая, подобно , "нижележащие" элементы. В приведенном примере элемент должен быть расположен внутри элемента

Для того, чтобы в шаблоне выделить не только собственные дочерние элементы, но и дочерние элементы потомков, т.е. использовать несколько уровней вложенности, необходимо задать параметр from = "descendants". Если параметр имеет значение "children", что указывает на то, что выбор должен производится из списка собственных дочерних элементов, то атрибут from может опускаться, т.к. "children" является значением по умолчанию.

Правила стилей

В отличие от CSS, в XSL невозможно использование каскадных стилевых определений(т.е. нельзя использовать несколько правил для определения стиля одного того же элемента), т.к. такие ограничения вводит рекурсивный алгоритм работы программы - анализатора. Однако использование правил определения стиля(Style Rules) элемента позволяет каким-то образом скомпенсировать этот недостаток.

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

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

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

Стили в формате CSS:

Фрагмент XSL- документа, позволяющего использовать подобные стилевые определения:

Сценарии

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

Для написания сценариев XSL использует специальный скриптовый язык - ECMAScript. Однако в msxsl для этих целей можно применять Microsoft JavaScript,- язык, который объединил в себе некоторые элементы стандартного JavaScript и ECMAScript.

Вычисление выражений

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

, в выходном документе окажутся следующие инструкции:

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

В следующем фрагменте XML- документа определяется элемент , в котором атрибут src используется для задания адреса файла, содержащего текст статьи.

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

После обработки этого фрагмента в выходной документ будет помещен элемент:

Выполнение инструкций

Другим способом помещения в выходной HTML- документ информации, являющейся результатом выполнения каких-либо операций JavaScript – сценариев является использовнаие инструкции ;:

Метод childNumber в данном случае возвращает текущий номер дочернего элемента.

Определение функций и глобальных переменных

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

Если применить эти правила к такому фрагменту XML- документу: , то на выходе HTML -документ будет содержать следующие элементы:

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

Использование Java Script для HTML

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

seem to be independent XML and XSLT files. Don't they have to be linked? Or do you somehow put them into a same file? Otherwise, how does one file know how to suck in data from the other file?

I agree that some of the W3Schools pages, such as that one, are inadequate. They could have easily included mention of linking the stylesheet, as is done in XSLT - Transformation.

4 Answers 4

You can add this after the xml declaration

this is to put into the XML (data) file? Is this the only way or can you also tell an XSLT file to get data from which XML file, or have a 3rd file that includes both an XML file with an XSLT file?

alternative could be to include the XML file into another XML file somehow that specifies the stylesheet, but not sure if this is straightforward (might need to specially author the XPaths etc.)

One file doesn't know to "suck in data" the other file, because the files aren't what will do the processing.

Some sort of XSLT processor will do this, and the way it will be told what to work on varies so it can handle different use cases.

In the case of rendering the entire transform of an XML document when it is displayed in a browser, then processing-instruction:

(Really it should have been "text/xml" for the type as that's the mime-type of an XSL document, but this was in the tail-end of the browser wars and browser feature implementation was still often happening faster than the speed of common-sense).

If you are controlling the transform programatically using a library of some sort (there are objects for client-side javascript and libraries in any language you're likely to want to do this from), then you've got enough control to detail what gets transformed by what. Some interesting cases here include.

You could even have a document with a node of content and a node of transforms, pick them out and run the transform.

If you are running the same transformation on multiple XML documents, it is very often more efficient to call some sort of "PreCompile()" method or similar, which takes a hit on that call to benefit all the subsequent transforms.

You might also want to add an output directive in your stylesheet:

This causes the output to have a leading xml declaration:

The problem is that "/" is the root, not the root element (or "document element").
Hierarchically, "/" is one level above the document element ( , in yor case). So this:

would actually work. Note the tiny little difference? Nicer would be this:

@DevNull That's debatable. Generically speaking, yes; speaking in terms of the particular situation, not really.

Just to expand and clarify a bit on what Tomalak posted: the root of an XML document is, in the DOM hierarchy, above the top-level element. It's exceptionally common to see the two confused. Consider this XML document:

The root of this document has three child nodes: a comment node, an element node, and another comment node. The top-level element is named root , because that's what everyone who creates XML instance documents does in order to perpetuate the confusion between the document root and the top-level element. (Especially if they're still at the point in their XML education where they use "node" when they mean "element.")

This gets us to one of the reasons that the template that Tomalak describes as "nicer" is nicer. If you extend the identity transform, the only thing that the XSLT will change in your document are the elements that you've built templates for. Every other node in the document is copied unchanged. So if your input document has comments around the top-level element, as in the above example, they won't get stripped out of the output, as they would if you simply implemented a template matching the Address element.

Of course, if you want your output to exclude comments, that's easily accomplished too; just don't implement the identity transform.

Есть необходимость в одном файле объединить и данные в формате xml и xslt шаблоны для их отображения. И чтобы браузер все это выводил в таком же виде, как если бы это были отдельные файлы.

Предположительно, если есть такая возможность - то или если xslt встроить в файл xml или если таблицу xslt и xml данные встроить в файл html.

Вопрос: реально ли это, и, если да - то как?

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

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

Посмотрите другие вопросы с метками xml xslt или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.26.42234

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Читайте также: