Статьи

XSLT Mediator Tutorial

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