apache-camel - 转换输入日期到 xs:dateTime 并格式化日期时的XSLT2.0 转换错误,也会增加日期

  显示原文与译文双语对照的内容
0 0

我试图将日期转换为有效的dateTime 格式,然后格式化日期。 但是,在包含 xs:dateTime 之后,我遇到转换错误。

<?xml version="1.0" encoding="UTF-8"?>
<book>
 <title>doublebell</title>
 <timestamp>02/06/2014 13:51:09</timestamp>
</book>

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="xml" version="1.0" encoding="UTF-8"
 indent="yes"/>
 <xsl:template match="/">
 <myentity>
 <label>
 <xsl:value-of select="book/title"/>
 </label>
 <date>
 <xsl:apply-templates select="book/timestamp"/>
 </date>
 </myentity>
 </xsl:template>
 <xsl:template match="book/timestamp">
 <xsl:variable name="datestr">
 <xsl:value-of
 select="concat(substring(., 7, 4), '-', substring(., 4, 2), '-', substring(., 1, 2), 'T', substring(., 12))"/>
 </xsl:variable>
 <!--<xsl:value-of select="$datestr"/> --> <!-- prints 2014-06-02T13:51:09 -->
 <xsl:variable name="date1" as="xs:dateTime" select="xs:dateTime($datestr)"/>
 <xsl:variable name="formatteddate1">
 <xsl:value-of select="format-dateTime($date1, '[Y0001]-[M01]-[D01]')"/>
 </xsl:variable>
 <xsl:value-of select="$formatteddate1"/>
 </xsl:template>
</xsl:stylesheet>

在使用"xs: 日期时间"时,我正在获取XSLT转换错误。 我不知道我在哪里做错了我在用这个工具 http://www.freeformatter.com/xsl-transformer.html

PS: 我可以使用 substring()concat() 函数格式化日期。 但是我喜欢用 dateTime 格式获取 date,这样我可以增加一天的日期。 因此,使用 xs:dateTime() 函数以有效的dateTime 格式获取数据。 是有效的dateTime 格式,它是一种数据类型'日期'[like datatype String, number etc ]

请给我一些错误的指示

更新:

甚至当我尝试基于如此简单的XSLT [ ( 基于 http://stackoverflow.com/questions/3885292/xslt-subtracting-days] ) 时。

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:fn="http://www.w3.org/xpath-functions">
 <xsl:template match="/">
 <xsl:value-of select="xs:date('2010-01-01')"/>
 </xsl:template>
</xsl:stylesheet>

我遇到错误。这次我也尝试了 Apache camel XSLT处理器

错误详细信息:

The first argument to the non-static Java function 'date' is not a valid object reference. javax.xml.transform.TransformerException: The first argument to the non-static Java function 'date' is not a valid object reference.

更新 1:

看起来这与XSLT转换 processor 有什么关系

http://www.freeformatter.com/xsl-transformer.html 不是 XSLT2.0 处理器,

我的Apache camel 默认处理器是 1.0,要处理 XSLT2.0,我需要显式地提到transformer作为一些 XSLT2.0 处理器,如 Saxon 9.4.0.1

主要问题解决

更新 2和更新 3为格式日期和递增日期

更新 2: [i am not posting in a different thread as this is inter-related ]

最后我需要添加一天到输入日期,这就是为什么我去 xs:dateTime的原因。

我正在放置我尝试的代码,以防它将对未来有用的人有用。 这一次我要去 <xsl:call-template/>

<?xml version="1.0" encoding="UTF-8"?>
<book>
 <title>doublebell</title>
 <timestamp>20131217-13:04:59-UTC</timestamp>
</book>

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>
 <xsl:template match="/">
 <date>
 <xsl:call-template name="formatdate">
 <xsl:with-param name="timestampstring" select="book/timestamp"/>
 </xsl:call-template>
 </date>
 </xsl:template>
 <xsl:template name="formatdate">
 <xsl:param name="timestampstring"/> <!-- date is 20131217-13:04:59-UTC -->
 <xsl:variable name="datestr"> 
 <xsl:value-of
 select="concat(substring($timestampstring, 1, 4), '-', substring($timestampstring, 5, 2), '-', substring($timestampstring, 7, 2), 'T', substring($timestampstring,10, 8))"/>
 </xsl:variable>
 date: <xsl:value-of select="$datestr"/><!-- date is 2013-12-17T13:04:59 -->
 date in custom format: <xsl:value-of select="format-dateTime($datestr, '[Y0001]-[M01]-[D01]')"/>
 date+1: <xsl:value-of select="xs:dateTime($datestr) + xs:dayTimeDuration('P1D')"/> <!-- add one day -->
 date+3: <xsl:value-of select="xs:dateTime($datestr) + xs:dayTimeDuration('P3D')"/> <!-- add three days -->
 </xsl:template>
</xsl:stylesheet>

输出

date: 2013-12-17T13:04:59
 date in custom format: 2013-12-17
 date+1: 2013-12-18T13:04:59 
 date+3: 2013-12-20T13:04:59

更新 3

如何增加天数,更多 generic? 我是这样做

<!-- Made generic, increment interval can be passed as parameter -->
<xsl:template name="formatdateafterincrement">
 <xsl:param name="timestampstring"/>
 <xsl:param name="incr"/>
 <!-- input format: 'YYYYMMDD-HH:MM:SS-UTC' -->
 <!-- output format after date increment: YYYY-MM-DD -->
 <xsl:variable name="datestr">
 <xsl:value-of
 select="concat(substring($timestampstring, 1, 4), '-', substring($timestampstring, 5, 2), '-', substring($timestampstring, 7, 2), 'T', substring($timestampstring,10, 8))"/>
 </xsl:variable>
 <xsl:variable name="datestrincr">
 <xsl:value-of select="xs:dateTime($datestr) + xs:dayTimeDuration($incr)"/>
 </xsl:variable>
 <xsl:value-of select="format-dateTime($datestrincr, '[Y0001]-[M01]-[D01]')"/>
</xsl:template>
<!-- how to call the template -->
<newdate>
 <xsl:call-template name="formatdateafterincrement">
 <xsl:with-param name="timestampstring" select="book/timestamp"/>
 <xsl:with-param name="incr" select="'P1D'"/> <!-- one day -->
 </xsl:call-template>
</newdate>

http://xsltransform.net/ 是一个好的XSLT 2.0处理器。

如果你有任何建议,请分享。 我没有具体的问题。 问题是答案。

时间:原作者:3个回答

0 0

原因是我用来转换的处理器都是 XSLT1.0 处理器。

我提到的在线工具: http://www.freeformatter.com/xsl-transformer.html 不是 XSLT2.0 处理器。 另外,使用 Apache camel的应用程序有默认的XSLT处理器 1.0. 使用 XSLT 2.0 processor 解决问题。 因此,这个错误与使用 XSLT 1.0处理器有关

另外,声明 <xsl:stylesheet version="2.0" 并不意味着你正在使用 XSLT 2.0处理器。 这是另一个错误的[illogical] 假设 !

要运行 xs:date 或者 xs:dateTime,我应该使用 XSLT 2.0 处理器

我在 Apache camel 配置中做了什么:

在 dependency [as jar or pom.xml dependency] as添加 Saxon 9.4.0.1,在我的Camel路径中,我进行了更改:

<route..
<from uri=
<to uri="xslt:stylesheets/test.xslt?transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl"/>
原作者:
0 0

运行了你的代码 <date>2014-06-02</date>

当你说"有效日期日期"你什么意思? python 日期时间Php?

原作者:
...