XSLT 1.0(xsltproc)-将日期格式从yyyy-mm-ddthh-mm-ssz转换为yyyy-MM-dd HH:mm:ss.SSS Z

时间:2019-03-18 22:53:31

标签: date xslt xslt-1.0

输入XML:

<testng-results>
<suite>
<test>
    <class>
        <test-method name="ABC" started-at="2019-03-13T21:26:52Z"></test-method>
        <test-method name="XYZ" started-at="2019-03-13T21:27:15Z"></test-method>
    </class>
</test>
</suite>
</testng-results>

我当前的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
  <Suite>
 <xsl:for-each select="testng-results/suite/test/class/test-method">
    <test>
       <xsl:attribute name="test_name">
          <xsl:value-of select="@name" />
       </xsl:attribute>
      <start_time>  </start_time>
    </test>
 </xsl:for-each>
  </Suite>

期望的输出XML:

<Suite>
  <test test_name="ABC">
<start_time>2019-03-13 21:26:52.000 +0000 </start_time>
 </test>
<test test_name="XYZ">
<start_time>2019-03-13 21:26:52.000 +0000 </start_time>
 </test>
</Suite>

我必须从“起始”值中获取日期,并将其转换为yyyy-MM-dd HH:mm:ss.SSS Z格式以生成输出xml。

我尝试使用format-dateTime函数,但是xsltproc(XSLT 1.0)不支持它。

2 个答案:

答案 0 :(得分:2)

AFAICT,您要做的就是用空格替换T,并附加.000 +0000而不是Z

<start_time>
    <xsl:value-of select="translate(@started-at, 'TZ', ' ')"/>
    <xsl:text>.000 +0000</xsl:text>
</start_time>

答案 1 :(得分:1)

以下XSLT-1.0样式表是一种无需时区调整的怪异方式:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="test-method">
    <test test_name="{@name}">
      <start_time><xsl:value-of select="concat(substring-before(@started-at,'T'),' ',substring-before(substring-after(@started-at,'T'),'Z'),'.000 +0000')" /></start_time>
    </test>
  </xsl:template>

  <xsl:template match="/testng-results">
    <Suite>
      <xsl:apply-templates select="suite/test/class/test-method" />
    </Suite>  
  </xsl:template>

</xsl:stylesheet>

其输出为:

<?xml version="1.0"?>
<Suite>
    <test test_name="ABC">
        <start_time>2019-03-13 21:26:52.000 +0000</start_time>
    </test>
    <test test_name="XYZ">
        <start_time>2019-03-13 21:27:15.000 +0000</start_time>
    </test>
</Suite>

P.S .:
输出还会更正所需输出XML中的错误:
“ XYZ”输入为2019-03-13T21:27:15Z,而不是2019-03-13T21:26:52Z