2015-10-06 204 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