Преобразование XML в HTML
Из предыдущего раздела вы узнали, как можно использовать HTTP GET для извлечения ResourcePropertyDocument WS-Resource и HTTP PUT для обновления WS-Resource. Метод HTTP GET возвращает XML-документ без SOAP-элементов. Просматриваемый в Web-браузере XML-документ обычно не выглядит нормально.
Для представления ResourcePropertyDocument в Web-браузере нужно преобразовать его в форму, которую браузер умеет визуализировать - либо HTML, либо Extensible HTML (XHTML). В данном разделе вы узнаете, как преобразовать ResourcePropertyDocument из XML в HTML, используя XSLT.
XSLT
Extensible Stylesheet Language (XSL) - это стандарт W3C (World Wide Web Consortium) для основанного на XML языка таблиц стилей. XSL объединяет три технологии: XSLT, XPath и XSL-FO. XSLT - это язык для преобразования XML-документов, XPath - это язык для навигации в XML-документах, а XSL-FO - это язык для форматирования XML-документов. В данном руководстве будут использоваться XSLT и XPath (мы не используем XSL-FO в этом приложении).
Для преобразования XML-документа в другой формат можно использовать XSLT. В данном случае мы хотим преобразовать XML документа ResourcePropertyDocument в HTML, для того чтобы его можно было отобразить в Web-браузере. XSLT-процессор, встроенный в Web-браузер, генерирует HTML-документ и заполняет его узлами (node) согласно правилам генерирования, определенным как шаблоны в XSLT таблице стилей. Каждый шаблон - это функция, принимающая узлы документа ResourcePropertyDocument в качестве входных данных и генерирующая узлы в HTML-документе, включая элемент root документа.
Шаблоны используют XPath-выражения для определения того, к каким узлам (атрибутам, элементам или тексту) они должны быть применены. Шаблоны могут вызывать другие шаблоны и рекурсивно определять поддерево. Сложность вывода данного шаблона может меняться. Например, шаблон, соответствующий узлу root, генерирует основную часть скелета Web-страницы, тогда как другие шаблоны могут генерировать только элемент или атрибут при соответствии специфическому типу узла input. Как вы увидите, именно так отображается значение ResourceProperties в HTML-элементах. Например, вы отобразите значение счетчика как input в HTML-форме Web-страницы.
Многие современные Web-браузеры поддерживают XSLT. Они проверяют ссылку на XSLT-файл таблицы стилей, встроенную в XML-документ, через инструкцию обработки XML. При нахождении такой ссылки и возможности ее разрешения в существующую XSLT таблицу стилей браузер загружает документ таблицы стилей и применяет его к XML-документу перед отображением. В предыдущем разделе вы видели, что ResourcePropertyDocument, извлеченный при помощи HTTP GET, содержал строку:
<?xml-stylesheet type="text/xsl" href="Counter.xsl"?>
|
Эта строка является ссылкой на XSLT-файл таблицы стилей. Web-браузер, который может выполнять XSLT-преобразования, загрузит документ Counter.xsl и применит его к ResourcePropertyDocument. Ссылки на дополнительную информацию по XSLT приведены в разделе "Ресурсы".
Теперь поместите wsa:Address URI WS-Resource-счетчика в адресную строку вашего Web-браузера. В HTML-таблице будет отображаться ResourceProperties. Можно проверить, что исходный код страницы (в Firefox выберите View > Page Source) все еще является тем же XML-документом, который извлек curl. Web-браузер автоматически преобразовал XML в HTML.
XSLT и WSRF::Lite
XSLT-файл для WS-Resource сохраняется в том же каталоге, что и Perl-модуль WS-Resource. Например, для основанного на процессе счетчика, XSLT-файл таблицы стилей размещен в каталоге $WSRF_MODULES/modules/WSRF/Counter и называется Counter.xsl. XSLT-файл таблицы стилей должен иметь то же имя, что и Perl-модуль, а также заканчиваться символами .xsl. Когда контейнер WSRF::Lite получает сообщение HTTP GET для WS-Resource, он проверяет, определен ли для этого типа WS-Resource XSLT-файл и автоматически включает ссылку на него в ResourcePropertyDocument. Контейнер включает ссылку, только если XSLT-файл таблицы стилей существует.
Counter.xsl
Откройте XSLT-файл для WS-Resource-счетчика и взгляните на его содержимое. Преобразование определяется в элементе xsl:template, как показано в листинге 7. Элемент xsl:template содержит HTML-элементы, которые должны быть включены для вывода в браузер, например, <h2>Counter ResourceProperties</h2> объявляет заголовок.
Листинг 7. Часть элемента xsl:template из файла Counter.xsl
<xsl:template match="/" xmlns:mmk="http://www.sve.man.ac.uk/Counter"
xmlns:wsrp="http://docs.oasis-open.org/wsrf/rp-2"
xmlns:wsrl="http://docs.oasis-open.org/wsrf/rl-2">
<html>
<head>
<link rel="stylesheet" href="Counter.css" type="text/css" />
<script type="text/javascript" src="Counter.js" />
</head>
<body onLoad="javascript: return onLoad();">
<h2>Counter ResourceProperties</h2>
<form name="prop">
<table border="1">
<tr>
<th align="left">Property</th>
<th align="left">Value</th>
</tr>
..................
|
Обратите внимание на то, что HTML содержит ссылку на CSS-файл таблицы стилей и JavaScript-сценарий. В следующем разделе вы узнаете больше об этом. Кроме того, обратите внимание на то, что когда загружается тело HTML-файла, активизируется JavaScript-функция.
Попробуйте добавить HTML-элементы или изменить существующие HTML-элементы в xsl:template. Затем перезагрузите страницу в Web-браузере, чтобы увидеть эффект от ваших изменений.
В листинге 8 значение wsrl:CurrentTime извлекается из ResourcePropertyDocument при помощи XPath-выражения select="/wsrp:ResourceProperties/wsrl:CurrentTime" и помещается в HTML-таблицу в сгенерированных выходных данных.
Листинг 8. Использование XPath для извлечения CurrentTime ResourceProperty из ResourcePropertyDocument
......................
<tr>
<td>wsrl:CurrentTime</td>
<td id="CurrentTime">
<xsl:value-of select="/wsrp:ResourceProperties/wsrl:CurrentTime" />
</td>
</tr>
.......................
|
Counter.css
В листинге 7 видно, что ссылка была включена для CSS-файла. CSS используется для определения того, как отображать HTML-элементы. Например, можно использовать CSS-файл для установки цвета фона всех ячеек таблицы на Web-странице. Используя CSS, вы можете определить общий внешний вид для набора Web-страниц путем создания одной таблицы стилей. После этого изменение способа представления набора Web-страниц потребует изменения только этой таблицы стилей. Ссылки на дополнительную информацию по CSS приведены в разделе "Ресурсы".
WSRF::Lite позволяет включить CSS-файл для конкретного типа WS-Resource. Файл должен находиться в том же каталоге, что и модуль WS-Resource, а также должен иметь то же имя, что и Perl-модуль WS-Resource, но с расширением .css. Откройте файл Counter.css в каталоге $WSRF_MODULES/modules/WSRF/Counter и взгляните на его содержимое, показанное ниже.
Листинг 9. Фрагменты из Counter.css
......................
.modifiable {
background-color: #9acd32;
}
.idle {
background-color: silver;
}
.active {
background-color: red;
}
.......................
|
Counter.css определяет цвет фона для определенных HTML-элементов. В листинге 10 показано, как этот CSS-файл используется с HTML.
Листинг 10. Фрагменты из Counter.xsl
......................
<tr>
<td class="modifiable">count</td>
<td class="modifiable">
<input id="count" type="text" size="20">
<xsl:attribute name="value">
<xsl:value-of select="/wsrp:ResourceProperties/mmk:count" />
</xsl:attribute>
<xsl:attribute name="onkeypress">javascript:
if ((event.which && event.which == 13)
|| (event.keyCode && event.keyCode == 13))
{ return updateResourcePropertiesFromPage(); }
</xsl:attribute>
</input>
</td>
</tr>
.......................
|
В листинге 10 показано, как формируется запись в HTML-таблице для значения счетчика. Строка таблицы имеет две ячейки, первая из которых содержит строку "count". CSS-класс modifiable управляет способом отображения этого элемента; этот класс (см. листинг 9) показывает, что цвет ячейки должен быть равен #9acd32. Измените какое-то значение цвета в CSS-файле таблицы стилей и перезагрузите Web-страницу, чтобы увидеть эффект от этих изменений.
Вторая ячейка в строке таблицы содержит действительное значение счетчика, которое извлекается из документа ResourcePropertyDocument с использованием XPath. Поскольку вы хотите, чтобы пользователь браузера мог изменять это значение, необходимо поместить его в HTML-форму. XSLT используется для добавления двух атрибутов в элемент input HTML-формы: один называется value и содержит значение счетчика, а второй содержит JavaScript-код. Этот JavaScript-код выполняется при вводе пользователем текста в поле input; он вызывает метод updateResourcePropertiesFromPage(), когда пользователь нажимает Enter, то есть когда код клавиши равен 13 (event.which и event.keyCode - это два способа проверки кода в Firefox и Internet Explorer, соответственно).
|