Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
带时区的XML日期时间_Xml_Datetime_Xslt_Xpath - Fatal编程技术网

带时区的XML日期时间

带时区的XML日期时间,xml,datetime,xslt,xpath,Xml,Datetime,Xslt,Xpath,是否有XPath或XSLT函数可用于转换日期,如“2015-10-15 11:45:46 EDT”要转换为带时区的有效XML dateTime格式?我不确定这是否是正确的方法,但下面的函数将不带时区的日期字符串部分转换为xs:dateTime,方法是在xs:date和xs:time部分之间放置一个T,然后将其格式化为parse ietf date可以解析的格式,包括数据中以前的时区部分: <?xml version="1.0" encoding="UTF-8"?> <xsl:s

是否有XPath或XSLT函数可用于转换日期,如“2015-10-15 11:45:46 EDT”要转换为带时区的有效XML dateTime格式?

我不确定这是否是正确的方法,但下面的函数将不带时区的日期字符串部分转换为
xs:dateTime
,方法是在
xs:date
xs:time
部分之间放置一个
T
,然后将其格式化为
parse ietf date
可以解析的格式,包括数据中以前的时区部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:function name="mf:parse-date" as="xs:dateTime">
      <xsl:param name="input" as="xs:string"/>
      <xsl:variable name="components" select="tokenize($input, ' ')"/>
      <xsl:variable name="dateTimeWithoutTz" select="xs:dateTime($components[1] || 'T' || $components[2])"/>
      <xsl:variable name="ietf-date" as="xs:string"
        select="format-dateTime($dateTimeWithoutTz, '[FNn,3-3], [D01] [MNn,3-3] [Y0004] [H01]:[m01]:[s01] ' || $components[3], 'en', (), ())"/>
      <xsl:sequence select="parse-ietf-date($ietf-date)"/>
  </xsl:function>

  <xsl:template match="date">
      <date input="{.}">{mf:parse-date(.)}</date>
  </xsl:template>

</xsl:stylesheet>

{mf:parse date(.)}
此时将给出输入的结果
2015-10-15 11:45:46-04:00


从已知时区名称到偏移量的映射可能更容易,然后用
T
替换日期和时间之间的空格,并用相应的偏移量替换时区名称,从而将输入直接转换为
xs:dateTime

您能确定时区缩写的含义吗?也许“EDT”也是如此,但其他值呢?例如,“CST”中的C代表中央、古巴还是中国?“BST”中的B代表英国还是孟加拉国?“IST”中的I代表印度还是爱尔兰?还有很多其他的例子。。。