Этот пост иллюстрирует 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>




