XSLT 1.0 (xsltproc) - преобразовать формат даты из гггг-мм-ддч-мм-ссз в гггг-мм-дд ЧЧ: мм: сс.SSS Z - PullRequest
0 голосов
/ 19 марта 2019

Входной 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>

Мне нужно получить дату из значения 'start-at' и преобразовать ее в формат гггг-мм-дд ЧЧ: мм: ss.SSS Z, чтобы сгенерировать вывод xml.

Я пытался использовать функцию format-dateTime, но она не поддерживается xsltproc (XSLT 1.0).

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

AFAICT, все, что вы хотите сделать, это заменить T пробелом и добавить .000 +0000 вместо Z:

<start_time>
    <xsl:value-of select="translate(@started-at, 'TZ', ' ')"/>
    <xsl:text>.000 +0000</xsl:text>
</start_time>
1 голос
/ 19 марта 2019

Довольно необычным способом без адаптации часового пояса является следующая таблица стилей 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>

PS:
Вывод также исправляет ошибку в желаемом выходном XML:
ввод 'XYZ' 2019-03-13T21:27:15Z, а не 2019-03-13T21:26:52Z.

...