Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期时间到历元,反之亦然xslt_Xslt - Fatal编程技术网

日期时间到历元,反之亦然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

我一直在尝试将给定的日期时间转换为大纪元时间,也将给定的大纪元时间转换为日期时间。我对xslt非常陌生,并且已经为此奋斗了一段时间,它没有给我任何结果。到目前为止,这里是我的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> 

要转换为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>