【问题标题】:OSB transform String to DateTime (xsl or xquery)OSB 将字符串转换为 DateTime(xsl 或 xquery)
【发布时间】:2020-05-29 08:32:47
【问题描述】:

我正在使用 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。但我发送此消息的应用程序需要一个“日期时间”类型。所以我需要将元素“Date”从“String”类型转换为“DateTime”类型。请记住,传入消息具有多个称为“日期”的元素。我尝试了带有替换操作的 For Each 阶段,但无法正常工作。

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

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

感谢您的帮助。

【问题讨论】:

  • 也许可以提供一些见解,您将数据发送到哪里会给某人提供线索,并且根据他们的经验,他们会提示您如何轻松地在另一端解析它。为您的问题提供更多背景信息会让您更容易理解。
  • 除了接收方期望元素“日期”的日期时间类型之外,您还需要知道什么?除非您有具体问题,否则我很乐意为您提供更多背景信息。

标签: xml oracle xslt xquery osb


【解决方案1】:

使用 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" 调整为输入文档之一。

【讨论】:

  • 感谢您的回答 Martin,正如您所提到的,这确实适用于一些额外的更改。我也发现了一个不同的方法,我相应地回答了。
【解决方案2】:

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

在从队列中提取传入消息的第一个管道中,我添加了一个“For-each 阶段”,其中包含一个“替换阶段”,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2011-10-16
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多