изменить внутренние значения тега или значения узла xml в wso2 esb, используя любой скрипт, работающий на wso2 esb - PullRequest
0 голосов
/ 16 ноября 2018

Это мой исходный XML

<request>
<applicationVersion>agidmp-5.0.0.0</applicationVersion>
<serviceName>changeRequestService</serviceName>
<changes>
  <change>
    <entityName>ChangeRequest</entityName>
    <path>ChangeRequest--4</path>
    <operation>a</operation>
    <values>
      <changeRequestName>ChangeRequest-CR-007</changeRequestName>
      <changeRequestNumber>ChangeRequest-CR-007</changeRequestNumber>
      <changeRequestUID>ChangeRequest-CR-007</changeRequestUID>
      <productCategory>20984</productCategory>
      <requestCategory.recordId>20032</requestCategory.recordId>
      <sourceSystem.recordId>20048</sourceSystem.recordId>
      <scopeDescription> Minimum age limit:15Years</scopeDescription>
    </values>
  </change>
  <change>
    <entityName>ChangeRequestScopeCountry</entityName>
    <path>ChangeRequest--4.changeRequestCountryList--7</path>
    <operation>a</operation>
    <values>
      <country.recordId>IND</country.recordId>
    </values>
  </change>
  <change>
    <entityName>ChangeRequestScopeCountry</entityName>
    <path>ChangeRequest--4.changeRequestCountryList--8</path>
    <operation>a</operation>
    <values>
      <country.recordId>AFG</country.recordId>
    </values>
  </change>
  <change>
    <entityName>ChangeRequestScopeCountry</entityName>
    <path>ChangeRequest--4.changeRequestCountryList--9</path>
    <operation>a</operation>
    <values>
      <country.recordId>AUT</country.recordId>
    </values>
  </change>
  <change>
    <path>ChangeRequest--4.submissionRequestScopeStudyProgramList--5</path>
    <operation>a</operation>
    <entityName>SubmissionRequestScopeStudyAndProgram</entityName>
    <values>
      <invStudy.recordId>40037</invStudy.recordId>
    </values>
  </change>
</changes>

И я хотел бы заменить значение тега в следующем пути: / soapenv: Body / request / changes / change / values ​​/country.recordId

Я пытался сделать обогащение посредника заменить свойство.Но это не меняет значения тегов в моем исходном XML.Пожалуйста, предложите любые методы для достижения этой цели. Мой xml должен быть похож на

<soapenv:Body xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
  <request>
    <applicationVersion>agidmp-5.0.0.0</applicationVersion>
    <serviceName>changeRequestService</serviceName>
    <changes>
      <change>
        <entityName>ChangeRequest</entityName>
        <path>ChangeRequest--4</path>
        <operation>a</operation>
        <values>
          <changeRequestName>ChangeRequest-CR-007</changeRequestName>
          <changeRequestNumber>ChangeRequest-CR-007</changeRequestNumber>
          <changeRequestUID>ChangeRequest-CR-007</changeRequestUID>
          <productCategory>20984</productCategory>
          <requestCategory.recordId>20032</requestCategory.recordId>
          <sourceSystem.recordId>20048</sourceSystem.recordId>
          <scopeDescription> Minimum age limit:15Years</scopeDescription>
        </values>
      </change>
      <change>
        <entityName>ChangeRequestScopeCountry</entityName>
        <path>ChangeRequest--4.changeRequestCountryList--7</path>
        <operation>a</operation>
        <values>
          <country.recordId>1234</country.recordId>
        </values>
      </change>
      <change>
        <entityName>ChangeRequestScopeCountry</entityName>
        <path>ChangeRequest--4.changeRequestCountryList--8</path>
        <operation>a</operation>
        <values>
          <country.recordId>1235</country.recordId>
        </values>
      </change>
      <change>
        <entityName>ChangeRequestScopeCountry</entityName>
        <path>ChangeRequest--4.changeRequestCountryList--9</path>
        <operation>a</operation>
        <values>
          <country.recordId>1236</country.recordId>
        </values>
      </change>
      <change>
        <path>ChangeRequest--4.submissionRequestScopeStudyProgramList--5</path>
        <operation>a</operation>
        <entityName>SubmissionRequestScopeStudyAndProgram</entityName>
        <values>
          <invStudy.recordId>40037</invStudy.recordId>
        </values>
      </change>
    </changes>
  </request>
</soapenv:Body>

. Можно ли это сделать, добавив код JavaScript или используя xQuery в посредниках wso2.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Как вы указали, вышеупомянутое решение не применимо к вашему конкретному случаю использования, я предложил другое решение с использованием foreach.

<proxy xmlns="http://ws.apache.org/ns/synapse" name="translate_landcodes" startOnLoad="true" statistics="disable" trace="disable" transports="http,https">
    <target>
        <inSequence>
            <foreach expression="//change">
                <sequence>
                    <filter xpath="//country.recordId">
                        <then>
                            <property expression="//country.recordId" name="landcode" scope="default" type="STRING"/>
                            <sequence key="get_landnumber"/>
                            <enrich>
                                <source clone="true" property="landnumber" type="property"/>
                                <target xpath="//country.recordId"/>
                            </enrich>
                        </then>
                    </filter>
                </sequence>
            </foreach>
            <respond/>
        </inSequence>
    </target>
    <description/>
</proxy>      

Я столкнулся со следующей ошибкой https://wso2.org/jira/browse/ESBJAVA-5227., котораяисправлено в IE 6.20 и новее, но я решил эту проблему, переместив вызов базы данных в отдельную последовательность:

<sequence name="get_landnumber" xmlns="http://ws.apache.org/ns/synapse">
    <dblookup>
        <connection>
            <pool>
                <dsName>jdbc/landcodes_db</dsName>
            </pool>
        </connection>
        <statement>
            <sql><![CDATA[select numbercode from translate where lettercode=?]]></sql>
            <parameter expression="get-property('landcode')"
                type="VARCHAR" xmlns:ns="http://org.apache.synapse/xsd"/>
            <result column="numbercode" name="landnumber"/>
        </statement>
    </dblookup>
</sequence>

Обратите внимание, что вы должны определить соединение с базой данных в конфигурации / источниках данных.

0 голосов
/ 16 ноября 2018

Интересный вопрос. Есть несколько доступных маршрутов. Я собирался предложить передать recordId как переменную в xslt, но после тщательного изучения я вижу, что вам нужно заменить несколько элементов 'recordId' для предположительно различных кодов земли, что, конечно, не тривиально.

В этом случае я бы предложил вам использовать xslt с таблицей поиска. Поскольку я сам не использовал ни одного из них, мне было любопытно, поэтому я возился с некоторыми примерами и придумал следующее:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://example.country"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<!-- copy everything that is not country.recordId -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<!-- create a lookup variable based on the table at the bottom -->
<xsl:key name="id-lookup" match="s:id" use="s:abbr"/>
<xsl:variable name="allrecordids" select="document('')/*/s:recordIds"/>

<!-- replace the country.recordIds -->
<xsl:template match="country.recordId">
    <xsl:apply-templates select="$allrecordids">
        <xsl:with-param name="curr-label" select="."/>
    </xsl:apply-templates>
</xsl:template>
<xsl:template match="s:recordIds">
    <xsl:param name="curr-label"/>
    <country.recordId><xsl:value-of select="key('id-lookup', $curr-label)/s:nr"/></country.recordId>
</xsl:template>

<!-- the lookup table -->
<s:recordIds>
    <s:id><s:abbr>AFG</s:abbr><s:nr>1234</s:nr></s:id>
    <s:id><s:abbr>IND</s:abbr><s:nr>1235</s:nr></s:id>
</s:recordIds>

</xsl:stylesheet>

Я сделал большое предположение, что 'IND' и 'AFG' всегда приводят к одному и тому же числу, так что, надеюсь, это поможет! По крайней мере, это было весело :)

...