Преобразование результатов веб-службы с помощью XSLT

Данные, возвращаемые веб-службой, обычно представляют собой XML-документ (по крайней мере, при использовании SOAP или REST).

В странице ASP.NET AJAX этот XML-документ представлен в виде объекта JavaScript, из которого можно извлечь всю необходимую информацию и отобразить ее с помощью HTML-элементов.

Другой способ преобразования данных веб-службы из формата XML в HTML заключается в использовании XSL?преобразований (XSLT). Описание принципов использования XSLT выходит за рамки этой книги, но в разделе «Для дополнительного чтения» в конце этой главы я приведу ссылки на ряд замечательных источников информации. Современные веб-броузеры (Mozilla, Internet Explorer, Opera 9+) обеспечивают поддержку XSLT в JavaScript, но эти реализации несовместимы между собой. Поэтому лучший способ заключается в выполнении преобразований на стороне сервера. Для этого можно написать свой собственный программный код .NET или воспользоваться компонентами ASP.NET AJAX. В этом разделе мы выполним преобразование результатов поиска, возвращаемых веб-службой Google, в разметку HTML, которая затем будет отображаться в веб-странице. Мост ASP.NET AJAX к веб-службе поддерживает два встроенных преобразователя, которые позволяют конвертировать объекты в другой формат.


Класс Microsoft.Web.Preview.Services.XmlBridgeTransformer конвертирует объект в формат XML, а класс Microsoft.Web.Preview.Services.XsltBridgeTransformer выполняет XSL-преобразование данных из формата XML в любой другой формат (обычно – HTML).

Как и прежде, начнем работу с подготовки моста, класса-обертки и сценария JavaScript, который приводит в действие механизм поиска. Сценарий JavaScript отправляет поисковый запрос из страницы мосту, который вызывает метод класса-обертки, который в свою очередь выполняет поиск. Результаты поиска возвращаются классу-обертке в виде объекта (как мы уже видели ранее, мы можем работать с объектом как с массивом). Затем класс?обертка передает данные мосту. Однако на этот раз мост не будет отправлять данные странице в том виде, в каком он их получил.

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


Затем мост посылает полученную разметку HTML странице, где одной строкой JavaScript она просто вставляется в контейнер, специально предназначенный для этого.

Мы будем использовать измененные версии трех файлов, которые ранее приводились в примерах поиска в Google. Кроме того, нам потребуется еще один дополнительный файл с расширением .xsl, содержащий разметку XSLT. Этот файл содержит описание преобразования, которое выполняется мостом для конвертирования XML в HTML.

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

Как и в предыдущем примере с Google, мы будем отображать результаты в виде HTML-списка
    . Таким образом, XSL-преобразование должно обойти результаты поиска, полученные в виде XML, что можно сделать с помощью XSL-цикла for each. Здесь есть одно небольшое препятствие. Каждый отдельный результат поиска находится внутри элемента , а преобразователь ASP.NET AJAX XML конвертирует его в элемент . Механизм преобразований XSL различает символы верхнего и нижнего регистров, поэтому вместо имени resultElement следует использовать ResultElement:
    ...


    Для каждого отдельного элемента результатов создается элемент
  • .


    Текст данного элемента – это ссылка (элемент (a)), которая указывает на веб-страницу для данного конкретного результата. Процессоры XSLT выполняют экранирование сущностей HTML, но веб-служба Google возвращает заголовок страницы в виде HTML (поскольку найденные совпадения выделены жирным шрифтом). Поэтому нам необходимо использовать атрибут disable-output-encoding для заголовков.

    Другой момент: так как нам необходимо создать фрагмент HTML, в элемент XSLT – следует включить атрибут omit-xml-declaration, чтобы предотвратить создание результата, окруженного тегами . Содержимое XSLT-файла приводится в примере 18.7.Пример 18.7. XSLT?файл для работы с веб-службой Google Google.xsl

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    Approx. matches!



    • (a)



      (/a)







    Наш следующий шаг – определить точку входа в преобразование XSL.


    В ней задавалось бы преобразование объекта в XML (с помощью Xml-BridgeTransformer) и преобразование XML в HTML (с помощью XsltBridgeTransformer). Для этой цели можно было бы создать новый метод
    в классе?обертке, выполняющем поиск с помощью веб-службы, который создает объект с результатами поиска для последующего преобразования, но во всем этом не содержится новой важной логики для реализации.

    В предварительных версиях ASP.NET AJAX внутри реализации моста в элементе можно было воспользоваться атрибутом serverName для перенаправления запросов методу класса-обертки:
    ...


    Здесь объявляется метод с именем SearchXslt(), который будет доступен в JavaScript, но он всего лишь исполняет существующий метод Search() класса-обертки. Последние версии ASP.NET AJAX больше не поддерживают такую возможность. Таким образом, необходимо выполнить перенаправление на стороне сервера, изменив содержимое файла GoogleSearchServiceWrapper.cs, как показано в примере 18.8.
    Пример 18.8. Измененная версия класса?обертки для доступа к службе поиска Google
    GoogleSearchServiceWrapper.cs
    using Google;
    public class GoogleSearchServiceWrapper
    {
    public GoogleSearchResult Search(string licenseKey, string query)
    {
    GoogleSearchService gss = new GoogleSearchService();
    return gss.doGoogleSearch(
    licenseKey,
    query,
    0,
    10,
    false,
    "",
    false,
    "",
    "",
    "");
    }
    public GoogleSearchResult SearchXslt(string licenseKey, string query)
    {
    return Search(licenseKey, query);
    }
    }

    Но вернемся к файлу с определением моста.


    Внутри элемента элемент остался без изменений, поскольку входные параметры не изменились. Однако здесь появился новый элемент , который определяет два преобразователя. Преобразователю XSLT должен быть предоставлен для работы файл XSL. В примере 18.9 приводится разметка XML для измененного файла моста.
    Пример 18.9. Измененная версия моста для доступа к веб-службе Google Google.asbx




    value="% appsettings : GoogleLicenseKey %"
    serverOnly="true" />




    value="% appsettings : GoogleLicenseKey %"
    serverOnly="true" />












    Теперь все, что осталось сделать, – это обратиться к мосту. Поскольку мост возвращает фрагмент разметки HTML, то результаты, полученные от веб-службы, можно просто записать в свойство innerHTML контейнера
    . Это существенно упрощает сценарий JavaScript.

    В примере 18.10 приводится полная страница ASP.NET с разметкой и программным кодом JavaScript.
    Пример 18.10. Вызов веб?службы Google с XSL?преобразованием результатов GoogleXslt.aspx
    <%@ Page Language="C#" %>
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX


    (body)
    (asp:ScriptManager ID="ScriptManager1" runat="server")

    (asp:ServiceReference Path="~/Google.asbx" /)


    Name="PreviewScript.js" />








    (/body)


    Безусловно, такой подход пригоден и для работы с веб-службой Amazon. Прежде всего, необходимо изменить файл моста. В примере 18.11 приводится новый код разметки.
    Пример 18.11. Измененная версия моста для доступа к веб?службе Amazon
    Amazon.asbx




    value="% appsettings : AmazonAccessKey %"
    serverOnly="true" />




    value="% appsettings : AmazonAccessKey %"
    serverOnly="true" />












    Кроме того, в классе?обертке необходимо реализовать фиктивную функцию для перенаправления обращений SearchXslt() методу Search(), как показано в примере 18.12.
    Пример 18.12. Измененная версия класса?обертки для доступа к веб-службе Amazon
    AWSECommerceServiceWrapper.cs
    using Amazon;
    public class AWSECommerceServiceWrapper
    {
    public Amazon.Items Search(string accessKey, string query)
    {
    ItemSearchRequest searchRequest = new ItemSearchRequest();
    searchRequest.Keywords = query;
    searchRequest.ResponseGroup = new string[] { "Small" };
    searchRequest.SearchIndex = "Books";
    ItemSearch search = new ItemSearch();
    search.AWSAccessKeyId = accessKey;
    search.Request = new ItemSearchRequest[1] { searchRequest };
    AWSECommerceService awse = new AWSECommerceService();
    ItemSearchResponse searchResponse = awse.ItemSearch(search);
    return searchResponse.Items[0];
    }
    public Amazon.Items SearchXslt(string accessKey, string query)
    {
    return Search(accessKey, query);
    }
    }

    Затем необходимо описать XSL-преобразование, которое будет конвертировать XML?документ, полученный от SOAP-службы Amazon, в HTML. В примере 18.13 представлен один из возможных вариантов.
    Пример 18.13. Таблица стилей для преобразования результатов вызова веб-службы Amazon в HTML
    Amazon.xsl

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    matches found!



    • :








    Наконец, для запуска трансформации используется программный код, очень похожий на пример 18.10. В примере 18.14 содержится полный листинг.
    Пример 18.14. Вызов веб?службы Amazon с XSL?преобразованием результатов
    AmazonXslt.aspx
    <%@ Page Language="C#" %>
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX


    (body)
    (asp:ScriptManager ID="ScriptManager1" runat="server")

    (asp:ServiceReference Path="~/Amazon.asbx" /)


    (asp:ScriptReference Assembly="Microsoft.Web.Preview"
    Name="PreviewScript.js" /)

    (/asp:ScriptManager)






    (/body)


    Оцените статью: (0 голосов)
    0 5 0

    Статьи из раздела ASP.NET AJAX на эту тему:
    Использование веб-службы Amazon
    Использование веб-службы Google
    Использование веб-службы Yahoo! (а также REST и XPath)