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