将多个dateTime字符串解析为xslt或TIBCO BW中的dateTime格式

时间:2018-08-13 17:53:38

标签: date datetime xslt xpath tibco

这是格式

<Record>
    <DateTime>2012-11-11T17:06:54</DateTime>
    <Description>Date1</Description>
</Record>
<Record>
    <DateTime>2012-11-11T17:06:54</DateTime>
    <Description>Date2</Description>
</Record>
<Record>
    <DateTime>2000-09-29T15:28:08</DateTime>
    <Description>Date3</Description>
</Record>
<Record>
    <DateTime>29-11-2012T14:35:53</DateTime>
    <Description>Date4</Description>
</Record>
    <Record>
    <DateTime>2000-09-29T15:28:10</DateTime>
    <Description>Date5</Description>
</Record>

我希望它们立即解析为dateTime格式,而不使用“ YY:MM:dd”等格式。

我在此格式之前使用过,但是我无法调试或发送输出,因为第四个Record标记具有不同的格式,如您在<DateTime>29-11-2012T14:35:53</DateTime>上例中所见。

有人知道我该如何解决..在我使用的“活动”输入中

$duration=xsd:dateTime(DateTime[1])
format-dateTime($duration,"[Y0001]-[M01]-[D01]")

但是由于<DateTime>29-11-2012T14:35:53</DateTime>,它什么也没显示。

我想要类似的输出

<Calendar>
    <Record>
        <DateTime>2000-09-29T15:28:07</DateTime>
        <Description>Date4</Description>
        <Difference>6476 Days 8 Hours 18 Minutes 48 Seconds</Difference>
    </Record>
</Calendar>

1 个答案:

答案 0 :(得分:1)

xsd:dateTime()函数只能解析有效的ISO 8601 dateTime格式的值。

您可以测试该值是否为castable as xsd:dateTime,对于那些不是,请使用正则表达式测试其是否与已知格式匹配,并使用正则表达式和捕获功能来replace()组以构造格式正确的ISO 8601格式的dateTime值,该值可以解析为xsd:dateTime

if (DateTime castable as xsd:dateTime ) then 
  xsd:dateTime(DateTime) 
else 
  if (matches(DateTime, '\d\d-\d\d-\d\d\d\dT.*')) then 
    xsd:dateTime(replace(DateTime, '(\d+)-(\d+)-(\d+)(T.*)', '$3-$2-$1$4')) 
  else ()

您可以添加其他if / else块以及您要支持的其他dateTime模式。

一旦您可以构造xsd:dateTime对象,就可以执行所需的计算。