输入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)不支持它。
答案 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
。