2015-10-06 208 views
1

我一直在尝试将给定的dateTime转换为epoch时间,并且还给出了给定的epoch时间dateTime。我对xslt相当陌生,并且一直在努力争取一段时间,但并没有给我任何结果。这里是我的XSLT到目前为止dateTime到Epoch,反之亦然xslt

<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> 

任何帮助,在此深表感谢。由于

+0

您需要使用像Saxon 9,XmlPrime或AltovaXML这样的XSLT 2.0处理器来支持'dateTime'数据类型以及持续时间和计算。您使用的是XSLT 2.0处理器吗?而XSLT代码片段没有声明'xsd'前缀,所以我不认为你的代码会被编译。为了将你的输入转换成'dateTime',使用'',那么你可以使用'$ date'计算。 –

+0

感谢Martin,实际上架构位置是一些本地文件到项目目录,而且我使用的是xslt 2.0。我按照建议修改了代码,但它说“错误:算术运算符没有为类型参数(xs:double,xs:dateTime)定义”。你能提出更多建议吗? – Novice

回答

4

Unix time转换为ISO 8601的日期时间:

<xsl:value-of select="xs:dateTime('1970-01-01T00:00:00') + xs:dayTimeDuration(concat('PT', UnixTime, 'S'))"/> 

要转换ISO 8601 date-time到Unix时间;

<xsl:value-of select="floor((xs:dateTime(ISODateTime) - xs:dateTime('1970-01-01T00:00:00')) div xs:dayTimeDuration('PT1S')) "/> 

需要XSLT 2.0。

工作演示:http://xsltransform.net/94rmq5L

+0

谢谢迈克尔。 – Novice

1

如果你正在尝试做这在XSLT 1.0 MSXML(我才知道,原来提问者没有):

<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> 

更换'1970-01-02'用任何你想要的文本节点并且这应该工作,只要该节点是有效的日期时间。如果不是的话,用DateTime.Parse/TryParse写一个简单的方法来做到这一点很容易。该模板的输出(针对任何有效的XML)将是86400。请注意,最好在CDATA节点中定义方法以避免需要转义引号或尖括号(此代码不会发生任何用途,但由于某种原因可能会扩展)。

+0

右丹xslt 2.0是问,仍然感谢努力! – Novice