我正在尝试将日期转换为有效的dateTime
格式,然后格式化日期。但是,在包含xs:dateTime
之后,我遇到转换错误。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<title>doublebell</title>
<timestamp>02/06/2014 13:51:09</timestamp>
</book>
XSLT:
<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:dateTime”时出现XSLT转换错误。我无法弄清楚我做错了什么 我正在尝试使用该工具:http://www.freeformatter.com/xsl-transformer.html
PS:我可以使用substring()
和concat()
函数格式化日期。但我希望以date
格式获取dateTime
,以便我可以将日期增加一天。因此,使用xs:dateTime()
函数以有效的dateTime
格式获取数据。
编辑:我的意思是有效dateTime
格式,是数据类型'date'[类似数据类型字符串,数字等]
请对我的错误提出一些指示
更新
即使我尝试这个简单的XSLT [基于SO - https://stackoverflow.com/questions/3885292/xslt-subtracting-days]
XSLT:
<?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
,我需要明确提到变压器为XSLT2.0
处理器Saxon 9.4.0.1
解决了主要问题
更新2和更新3 格式化日期和增加日期
更新2: [我不会在另一个帖子中发帖,因为这是相互关联的]
最后我需要在输入日期添加一天,这就是我去xs:dateTime
的原因。
我正在放置我尝试的代码,以防将来对其他人有用。这次我要去<xsl:call-template />
XML:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<title>doublebell</title>
<timestamp>20131217-13:04:59-UTC</timestamp>
</book>
XSLT:
<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处理器。
这很有效。如果有人有任何建议,请分享一下。我没有具体的问题。问题已得到解答。
答案 0 :(得分:3)
原因是我用来转换的处理器都是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处理器。这是我的另一个错误的[不合逻辑的]假设!
要运行xs:date
或xs:dateTime
,我应该使用XSLT 2.0
处理器
我在Apache Camel配置中做了什么:
添加Saxon 9.4.0.1
作为依赖[作为jar或pom.xml依赖],
在我的骆驼路线上,我做了改变:
<route..
<from uri=
<to uri="xslt:stylesheets/test.xslt?transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl" />
答案 1 :(得分:0)
运行您的代码并获得<date>2014-06-02</date>
当你说“有效日期时间”时,你的意思是什么? Python dateTime? PHP?