OSB преобразовывает String в DateTime (xsl или xquery) - PullRequest
0 голосов
/ 29 мая 2020

Я работаю с Oracle OSB, и у меня есть следующее входящее xml сообщение:

<db:InputParameters>
    <db:DETAILS>
        <db:DETAILS_ITEM>
            <db:Mutate>W</db:Mutate>
            <db:Date>2020-04-06T14:43</db:Date>
            <db:Account>T</db:Account>
        </db:DETAILS_ITEM>
        <db:DETAILS_ITEM>
            <db:Mutate>W</db:Mutate>
            <db:Date>2020-04-06T14:43</db:Date>
            <db:Account>T</db:Account>
        </db:DETAILS_ITEM>
    </db:DETAILS>
</db:InputParameters>

Элемент «Дата» является «строкой» -> согласно xsd. Но приложение, которому я отправляю это сообщение, ожидает тип «DateTime». Поэтому мне нужно преобразовать элемент «Дата» из типа «String» в тип «DateTime». Имейте в виду, что входящее сообщение имеет более одного элемента с названием «Дата». Я пробовал этап For Each с действием замены, но не смог заставить его работать.

Кроме того, я попытался объединить ": 00" с элементом "Date" с выражением: fn:concat($body/*:inputparameters/*:DETAILS/*:DETAILS_ITEM/*:Date,':00') This похоже, тоже не сработало.

Какое было бы самое простое решение этой проблемы?

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

С помощью XSLT вы можете изменить значение элемента следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:db="http://example.com/db"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="db:DETAILS_ITEM/db:Date">
      <xsl:copy>
          <xsl:value-of select="concat(., ':00')"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/pNmCzsv

Обратите внимание, что это просто изменяет содержимое этого элемент на значение, которое может быть проанализировано как xs:dateTime. Нет никакой схемы или какой-либо проверки. Вам нужно будет адаптировать объявление пространства имен xmlns:db="http://example.com/db" к одному из входного документа.

0 голосов
/ 02 июня 2020

С некоторой помощью коллеги я нашел следующее решение.

В первом конвейере, который забирает входящее сообщение из очереди, я добавил «Для каждого этапа» с «этапом замены» внутри это выглядит так:

For Each [ curValue ] in [*:InputParameters/*:DETAILS/*:DETAILS_ITEM/*:Date]
of [ body ]
Indexed by [ curIndex ] with total count in [ curCount ]
Do (

Replace [ node contents ] of [ *:InputParameters/*:DETAILS/*:DETAILS_ITEM[$curIndex]/*:Date]
in [ body ] with [ fn:concat($curValue,":00")]
...