Этот пост иллюстрирует WSO2 ESB XSLT Transform Mediator с примером кода.
Когда нам нужен XSLT-медиатор, нужен ли wso2 ESB?
Когда нам приходится иметь дело с динамическим запросом на прокси ESB. (Если запрос прокси является динамическим (не статичным / не предопределенным), нам придется использовать посредник XSLT для передачи сообщения)
Что такое XSLT Mediator?
Посредник XSLT применяет указанное преобразование XSLT к выбранному элементу текущей полезной нагрузки сообщения. Атрибут source указывает, какой элемент должен иметь XSLT-преобразование. Элемент Feature определяет в TransformerFactory.
Если исходный элемент не указан, мыло body как выбранный элемент. Параметры могут быть переданы в преобразования через элементы свойства, и это необязательно, и к ним можно получить доступ во время преобразования с помощью <xsl: param name = «имя свойства» />.
Что такое синтаксис посредника WSO2 ESB XSLT?
<xslt key="string" [source="xpath"]> <property name="string" (value="literal" | expression="xpath")/>* <feature name="string" value="true| false" />* <resource location="string" key="string"/>* </xslt>
- Источник — указывает, какой элемент должен быть выбран для применения данного преобразования XSLT.
- Свойство — позволяет передавать необязательные параметры в преобразования.
- Feature — Определяет любые функции, которые должны быть явно установлены в TransformerFactory.
- Ресурс — разрешает импорт XSLT и включает его из репозитория.
Вот кое-что, что я буду использовать в скрипте XSLT
Элемент <xsl: apply-templates> применяет шаблон к текущему элементу или к дочерним узлам текущего элемента. Если мы добавим атрибут select к элементу <xsl: apply-templates>, он обработает только дочерний элемент, который соответствует значению атрибута. Мы можем использовать атрибут select, чтобы указать порядок, в котором обрабатываются дочерние узлы. [1]
Опустить-XML-декларация
значения: да ИЛИ нет Необязательно.
«yes» указывает, что объявление XML (<? xml …?>) должно быть опущено в выводе. «no» указывает, что объявление XML должно быть включено в вывод. По умолчанию «нет»
отступ
значения: да ИЛИ нет Необязательно.
«да» означает, что выходные данные должны иметь отступ в соответствии с его иерархической структурой. «Нет» означает, что выходные данные не должны иметь отступ в соответствии с его иерархической структурой.
Этот атрибут не поддерживается Netscape 6 [2]
Давай сделаем образец
Мы можем попробовать наши транспортные услуги (BusServices) [3]
Вот ожидающий запрос
<sample:getBusNo xmlns:sample="http://transport.org"> <xs:rootId xmlns:xs="http://transport.org">2</xs:rootId> </sample:getBusNo>
Back end Serive ожидающий запрос
<p:getBusNo xmlns:p="http://transport.org"> <xs:rootId xmlns:xs="http://transport.org">2</xs:rootId> </p:getBusNo>
1. Запустите BusServices в WSO2 AS
2. Запустите WSO2 ESB со смещением 1
3. Перейдите в раздел Домашняя страница> Управление> Шина обслуживания> Локальные записи в ESB
4. Затем добавьте Добавить
встроенную запись XML 5. Пять имен как «in_xslt» и Значение как показано ниже (файл transform.xsl содержит)
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xs="http://transport.org" xmlns:sample="http://transport.org" exclude-result-prefixes="sample fn"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates select="//sample:getBusNo"/> </xsl:template> <xsl:template match="sample:getBusNo"> <p:getBusNo xmlns:p="http://transport.org"> <xs:rootId xmlns:xs="http://transport.org"> <xsl:value-of select="xs:rootId"/> </xs:rootId> </p:getBusNo> </xsl:template> </xsl:stylesheet>
Теперь мне нужно изменить свой ответ
от:
<ns:getBusNoResponse xmlns:ns="http://transport.org"> <ns:return>4Colombo</ns:return> <ns:return>Negombo</ns:return> <ns:return>Galle</ns:return> </ns:getBusNoResponse>
чтобы:
<ns:getBusNoResponse xmlns:ns="http://transport.org"> <ns:rootName>2Colombo</ns:rootName> <ns:rootName>Negombo</ns:rootName> <ns:rootName>Galle</ns:rootName> </ns:getBusNoResponse>
Вот скрипт XSLT для этого
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:ns="http://transport.org" exclude-result-prefixes="ns fn"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates select="//ns:getBusNoResponse"/> </xsl:template> <xsl:template match="ns:getBusNoResponse"> <ns:getBusNoResponse xmlns:ns="http://transport.org"> <xsl:for-each select="ns:return"> <ns:rootName> <xsl:value-of select="."/> </ns:rootName> </xsl:for-each> </ns:getBusNoResponse> </xsl:template> </xsl:stylesheet>
Добавьте его в последовательности out в прокси
Вот финальное тестирование
ПРИМЕЧАНИЕ.
В любом случае, если я получаю пустую строку в RootID, я добавляю новое имя RootName
<xsl:choose> <xsl:when test=".!= ''"> <rootNmae><xsl:value-of select="."/></rootNmae> </xsl:when> <xsl:otherwise> <rootNmae>Root<xsl:text> </xsl:text>text</rootNmae> </xsl:otherwise> </xsl:choose>