OSB 将字符串转换为日期时间(xsl 或 xquery)

OSB transform String to DateTime (xsl or xquery)

我正在使用 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>

元素 "Date" 是 "string" -> 根据 xsd。但是我要将此消息发送到的应用程序需要 "DateTime" 类型。所以我需要将元素 "Date" 从类型 "String" 转换为类型 "DateTime"。请记住,传入的消息包含多个名为 "Date" 的元素。我尝试了一个带有替换操作的 For Each 阶段,但我无法让它工作。

此外,我尝试使用以下表达式将“:00”连接到 "Date" 元素:fn:concat($body/*:inputparameters/*:DETAILS/*:DETAILS_ITEM/*:Date,':00') 这似乎也没有用。

最简单的解决方案是什么?

感谢您的帮助。

使用 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" 以适应输入文档之一。

在同事的帮助下,我找到了以下解决方案。

在从队列中获取传入消息的第一个管道中,我添加了一个 "For-each stage",里面有一个 "replace stage",如下所示:

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")]