日期时间到历元,反之亦然xslt
我一直在尝试将给定的日期时间转换为大纪元时间,也将给定的大纪元时间转换为日期时间。我对xslt非常陌生,并且已经为此奋斗了一段时间,它没有给我任何结果。到目前为止,这里是我的xslt日期时间到历元,反之亦然xslt,xslt,Xslt,我一直在尝试将给定的日期时间转换为大纪元时间,也将给定的大纪元时间转换为日期时间。我对xslt非常陌生,并且已经为此奋斗了一段时间,它没有给我任何结果。到目前为止,这里是我的xslt <xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://www.NoPreAuth.org
<xsl:stylesheet version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://www.NoPreAuth.org"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsi xsl ns0 xsd">
<xsl:template match="/">
<xsl:variable name="date1">
<xsl:value-of select="/ns0:NoAuthInput/ns0:StartDate"/>
</xsl:variable>
<xsl:variable name="date2">
<xsl:value-of select="/ns0:NoAuthInput/ns0:EndDate"/>
</xsl:variable>
<ns0:NoPreAuthInput>
<ns0:Product>
<xsl:value-of select="/ns0:NoAuthInput/ns0:Product"/>
</ns0:Product>
<!-- datTime to epoch -->
<ns0:END_T>
<xsl:value-of select= "(('$date1') - xsd:dateTime('1970-01-01T00:00:00') ) div xsd:dayTimeDuration('PT1S') "/>
</ns0:END_T>
<!-- epoch To datTime -->
<ns0:Closed_T>
<xsl:value-of select= "(('$date2') + xsd:dateTime('1970-01-01T00:00:00') ) * xsd:dayTimeDuration('PT1S') "/>
</ns0:Closed_T>
</ns0:NoPreAuthInput>
</xsl:template>
</xsl:stylesheet>
我尝试转换的xml是:
<?xml version="1.0" encoding="UTF-8" ?>
<NoAuthInput xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.NoAuth.org
xmlns="http://www.NoAuth.org">
<Product>ABC</Product>
<StartDate>2015-10-05T15:52:40.782</StartDate>
<EndDate>1444150760</EndDate>
</NoAuthInput>
要转换为ISO 8601日期时间:
<xsl:value-of select="xs:dateTime('1970-01-01T00:00:00') + xs:dayTimeDuration(concat('PT', UnixTime, 'S'))"/>
转换到Unix时间
<xsl:value-of select="floor((xs:dateTime(ISODateTime) - xs:dateTime('1970-01-01T00:00:00')) div xs:dayTimeDuration('PT1S')) "/>
需要XSLT2.0
工作演示:如果您试图在MSXML上的XSLT1.0中实现这一点(我知道原始的询问者不是):
将'1970-01-02'
替换为所需的任何文本节点,只要该节点是有效的日期和时间,该操作就可以运行。如果没有,那么使用DateTime.Parse/TryParse
编写另一个简单的方法就很容易了。此模板的输出(针对任何有效的XML)将是86400
。请注意,最好在CDATA
节点中定义方法,以避免需要转义引号或尖括号(此代码没有使用任何引号或尖括号,但出于某种原因可能会扩展到)。您需要使用XSLT 2.0处理器,如Saxon 9,XmlPrime或AltovaXML支持dateTime
数据类型以及持续时间和计算。您使用的是XSLT2.0处理器吗?XSLT代码段没有声明xsd
前缀,因此我认为您的代码不会编译。要将输入转换为dateTime
使用
,则可以使用$date
进行计算。感谢Martin,实际上架构位置是项目目录的某个本地文件,是的,我使用的是xslt 2.0。我确实按照建议修改了代码,但它说“错误:没有为类型(xs:double,xs:dateTime)的参数定义算术运算符”。你能在这方面提出更多的建议吗?丹·XSLT2.0被问到了,仍然感谢你的努力!很酷的例子,真的需要这个:)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:userCSharp="http://stackoverflow.com/xsltexample">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/">
<xsl:value-of select="userCSharp:DateToEpoch('1970-01-02')" />
</xsl:template>
<msxsl:script language="CSharp" implements-prefix="userCSharp"><![CDATA[
public string DateToEpoch(string s)
{
DateTime dt = DateTime.Parse(s);
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (dt - epoch).TotalSeconds.ToString();
}
]]></msxsl:script>
</xsl:stylesheet>