Невозможно получить xsl стили для файла

Обновлено: 07.07.2024

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

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

Так есть ли какой-нибудь способ создать какой-нибудь файл с надписью "Возьми этот XML и этот XSLT и отобрази результат в окне браузера"?

Edit:

Возможно, мой вопрос был неясным.

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

Есть ли способ применить XSLT к файлу XML без файла XML иметь явную ссылку на файл XSLT?

Конечно. На самом деле спецификация XSLT вообще не полагается (не упоминается) на файл XML, имеющий ссылку на таблицу стилей XSLT для его обработки .

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

В XSLT 2.0 и более поздних версиях даже для преобразования XSLT не требуется применять соответствующий документ XML.

Как это можно сделать ?

Кроме того, почти каждый процессор XSLT имеет утилиту командной строки для вызова преобразования из окна консоли - снова проверьте соответствующую документацию ( msxsl.exe для MSXML, nxslt.exe для XslCompiledTransform, .. и т. д.)

Вот несколько командных строк для процессоров XSLT, которые я использую :

Это вызывает процессор MSXML 3:

Это вызывает процессор MSXML 4:

Это вызывает процессор MSXML 6:

Это вызывает AltovaXML (XML-SPY) для XSLT 10:

Это вызывает AltovaXML (XML-SPY) для XSLT 2.0:

Это вызывает Saxon 9.x (для XSLT 2.0):

Это вызывает XQSharp (XSLT 2.0):

Во всем вышеперечисленном %xml% - это путь к файлу XML, %xsl% - это путь к первичному файлу XSLT, %out% - это путь к файлу, который будет содержать вывод из преобразования.

%param[ name="value"]% - это список name = value спецификации параметров, и это не обязательно использовать.

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

Простой способ здесь

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

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

Да, это возможно. Все реализации XSL-T имеют API для выполнения преобразования XSL-T над файлом XML.

Реагирование на требование редактирования OP для выбора различных XSLT из браузера.

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

Или может быть способ динамически добавить инструкцию обработки в документ и обновить ее?

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

Примечание. Если вы запустите пример, сделайте это с помощью браузера напрямую, как я обнаружил, что запуск файла test.html из IDE, такой как WebStrom, приводит к тому, что при щелчке по ссылкам это происходит.

Если это отвечает на ваш вопрос (или является наиболее близким к нему), пометьте его как выбранный ответ, чтобы этот пост мог быть указан как решенный.

В прошлой статье я описал как реализовать инклудинг и кеширование при обработке xsl-темплейтов на стороне клиента. Сегодня я раскажу с помощью каких инструментов можно проводить отладку xslt-преобразований на стороне клиента и о работе конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> в firefox.

Отладка XSLT на клиенте


Во время обработки xsl-документов в браузере могут происходить различные ошибки:
1) сетевые ошибки — когда xml или xsl данные не были получены;
2) ошибки обработки шаблонов.

Сетевые ошибки

Для контроля сетевых ошибок можно использовать отладочные средства браузеров. Все отладочные средства firebug (firefox), dragonfly (opera) и devtools (chrome) могут показать какие ресурсы были загружены из сети непосредственно ассинхронным запросом. Например, если мы обрабатываем данные in_data.xml с помощью шаблона first.xsl, то загрузку этих данных мы сможем проконтролировать
— раздел «net» в firebug
— раздел «net» в dragonfly
— раздел «resources» в devtools.


Иначе дело обстоит если для успешной обработки нужно подгрузить дополнительный xsl-файл (инклуд). В этом случае firebug (firefox) не покажет, что что-то было загружено.

А интегрированные среды дебагинга dragonfly (opera) и devtools (chrome) покажут какие дополнительные xsl файлы были подгружены.

Ошибки обработки шаблонов

* This source code was highlighted with Source Code Highlighter .


В этом случае вывод ошибки будет примерно таким:

Событие «error» будет вызвано в случае возникновения ошибки. В функцию события будет передано несколько параметров, основной из которых — error — собстенно описание ошибки.

disable-output-escaping=«yes» в firefox

Описание проблемы

В некоторых случаях в xml-данных могут приходить целые куски отформатированного html, в этих случаях эти куски нужно вставлять в конечный документ без изменений, то есть «как есть». Например это могут быть данные, содержащие результаты поиска, в которых искомое слово выделенно жирным («мы <b>искали</b> все возможные решения»). Сделать простую замену текста средствами xslt можно, но того не стоит (попробуйте как-нибудь на досуге заняться этим). Поэтому проще передавать уже отформатированный текст. Опытный программист придумает ещё массу примеров. Для вставки данных без экранирования в xslt есть специальный атрибут disable-output-escaping, который необходимо установить в «yes». Выглядит это так

< xsl:value-of select ="xxx" disable-output-escaping ="yes" />

* This source code was highlighted with Source Code Highlighter .

Решение проблемы

Существует такое решение проблемы — использовать вместо конструкции <xsl:value-of select=«xxx» disable-output-escaping=«yes»/> вызов <xsl:copy-of select=«xxx»/>. Но в этом случае мы не можем передать в узле xxx данные в виде

* This source code was highlighted with Source Code Highlighter .

* This source code was highlighted with Source Code Highlighter .

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

Другое решение проблемы

Я решил использовать другой подход. Использовать специальный фикс, написанный на javascript.

1. Вместо привычного <xsl:value-of select="xxx" disable-output-escaping="yes"/> в наших шаблонах придётся использовать вызов

< xsl:call-template name ="inc_disable_output_escaping" >< xsl:with-param name ="param" select ="xxx" />
</ xsl:call-template >

* This source code was highlighted with Source Code Highlighter .

Где темплейт inc_disable_output_escaping выглядит так:

< xsl:template name ="inc_disable_output_escaping" >
< xsl:param name ="param" ></ xsl:param >
< xsl:choose >
< xsl:when test ="system-property('xsl:vendor')='Transformiix'" >
<!-- костыль для firefox -->
< div style ="display:none" class ="fix_ff_disable_output_escaping" >< xsl:value-of select ="$param" disable-output-escaping ="yes" />
</ div >
</ xsl:when >
< xsl:otherwise >
< xsl:value-of select ="$param" disable-output-escaping ="yes" />

</ xsl:otherwise >
</ xsl:choose >
</ xsl:template >

* This source code was highlighted with Source Code Highlighter .


В этом темплейте по имени xsl-процессора (xsl:vendor) мы выведем данные стандартной конструкцией с disable-output-escaping=«yes», а в случае xsl-процессора от firefox'а данные вставим в невидимый контейнер так, как firefox эти данные может вставить, то есть в экранированном виде.
А потом, после успешного преобразования, и обновления DOM документа, мы перекодируем данные в этих контейнерах на правильные и вставим их на место этих контейнеров.

function fix_ff_disable_output_escaping() jQuery( 'div.fix_ff_disable_output_escaping' ).each(
function (i, obj) var j_obj=jQuery(obj);
j_obj.replaceWith(Encoder.htmlDecode(j_obj.html()));
>
)
>

* This source code was highlighted with Source Code Highlighter .

Для декодирования html-мнемоник используется функция htmlDecode js-библиотеки Encoder.

PS Не забывайте отправлять правильный content-type для xml/xsl документов. А именно «Content-type: text/xml».

Стандарт Extensible Stylesheet Language Transformation (XSLT) указывает определение языка для преобразований данных XML. XSLT используется для преобразования XML-документов в XHTML-документы или в другие XML-документы. В этой статье показано, как использовать XSLT с Microsoft Office Project XML-файлами обмена данными 2007 г. для фильтрации и отображения сведений о проекте. (Содержимое этой статьи было предоставлено Джессикой Бриттон, корпорация Майкрософт.)

Сведения о сохранении проектов в виде Project XML-файлов обмена данными см. в материалах Saving and Opening Projects in XML Format.

Таблица стилей XSLT — это XML-документ, состоящий из сочетания разметки XHTML, правил шаблона XSLT и отчетов XPath, которые работают вместе.

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

Правила шаблона XSLT предоставляют инструкции по преобразованию элемента XML источника определенным образом.

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

Если элемент XML соответствует шаблону XPath, вызывается связанное правило шаблона XSLT. Преобразованные данные затем отображаются в рамках отображения, заданной разметка XHTML.

Дополнительные сведения о правилах шаблона XSLT и утверждениях XPath см. в ссылке в конце этой статьи.

Отображение Project с помощью преобразований XSLT

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

Создайте XSLT-файл для таблицы стилей. Если вы работаете в Microsoft Visual Studio 2005 г., вы можете использовать шаблон XSLT File (в Visual Studio нажмите кнопку Файл, указать на Новый , а затем нажмите файл . Этот шаблон предварительно заселяется кодом XML, показанным в следующем примере. Если вы работаете в другом тексте или редакторе XML, скопируйте XML-шаблон и вклейте его в XSLT-файл.

Удалите следующий комментарий по коду XML. Здесь вы пишете XSLT-код.

Создайте код XSLT. Код XSLT, показанный в этом примере, делает следующее:

Отображает текстовое значение имени ребенка элемента Project в загонах.

Проверяет ребенка сводки каждого элемента Задачи, чтобы узнать, является ли значение 0 (false).

Тестирует критическое дитя каждого элемента Задачи, чтобы узнать, является ли значение 1 (true).

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

Отображает данные для некритических задач, которые не являются сводными задачами.

Сортировка сведений о ресурсах в алфавитном порядке по текстовому значению имени каждого элемента Ресурса.

Тестирует переоправдаемого ребенка каждого элемента Ресурса, чтобы узнать, является ли значение 1 (true).

Отображает отсортченные данные ресурсов только для перенаваляемых ресурсов.

Сохраните файл в качестве ProjectTransform.xslt.

После создания таблицы стилей XSLT необходимо связать Project XML-файл с ней, добавив инструкции по обработке. В процедуре 2 показано, как связать файл ProjectTransform.xslt, созданный в процедуре 1, с любым Project XML-файлом.

Процедура 2. Чтобы изменить Project XML-файл, используйте таблицу стилей XSLT:

Откройте файл Project XML в Visual Studio или в другом тексте или редакторе XML.

Вставьте следующую строку кода после объявления XML, которая является первой строкой в Project XML-файле.

Удалите объявление пространства имен XML из Project, который является корневым элементом Project XML-файла. Если вы не удалите объявление пространства имен, встроенное в элемент Project, XPath не будет соответствовать элементам в XML Project XML-файле.

После выполнения этапов 2 и 3 первые три строки XML Project XML-файла должны выглядеть следующим примером кода.

Сохраните Project XML-файл.

Рекомендуется сохранить файл с помощью имени файла, которое отличается от исходного имени XML Project XML, так как изменения, внесенные в шаге 3, отсоедят XML-файл Project от схемы Project XML-обмена данными.

Просмотр преобразованного Project XML-файла. Преобразование XSLT можно выполнить в Visual Studio, задав свойство Stylesheet XML Project xML-файла ProjectTransform.xslt, а затем выбрав show XSLT Output из меню XML.

Вы также можете открыть Project XML-файл в Internet Explorer 7, Microsoft Office Word 2007 или любом другом приложении, которое поддерживает XSLT.

Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы (CSS-Cascading Style Sheets) уже больше года используются Web-разработчиками для оформления Web-страниц.

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

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

Некоторые его отличия от CSS:

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

На сегодняшний день единственным броузером, поддерживающим некоторые из этих возможностей, является бэта-версия Internet Explorer 5.0, однако в самом ближайшем будущем, безусловно, XSL будет использоваться также широко, как сегодня стандартные тэги HTML

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

С чего начать

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

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

Правила XSL

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

Элементы XML, к которым будет применяться форматирование, обозначаются в XSL дескриптором <target-element/>;. Для указания элемента с конкретным названием (название элемента определяется тэгами, его обозначающими), т.е. определения класса элемента, можно использовать атрибут type="<имя_элемента>"

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

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

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

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

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

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

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