将Date转换为ISO 8601格式并更新节点xslt的值

时间:2017-04-11 15:15:31

标签: xml xslt xslt-2.0

我有一个像下面这样的xml:

Length10000000000000000000000
m is: 2147483647 and has a max value: 2147483647

我想将日期格式更改为ISO 8601.并使用xslt更新日期标记的值。 输出xml应该是这样的

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<properties>
<entry key="date">11-15-2017 22:45:59</entry>
</properties>

我已经使用转换后的日期值定义了一个变量。我正在使用这个xslt但没有获得所需的输出。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<properties>
<entry key="date">11-15-2017T22:45:59Z</entry>
</properties>

有人可以帮我解决这个问题,因为我是XSLT的新手。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

  <xsl:template match="entry[@key='date']">
    <xsl:variable name="dateparam" select="."/>
    <xsl:variable name="dd" select="xs:date(substring-before(., ' '))"/>
    <xsl:variable name="tt" select="xs:time(substring-after(., ' '))"/>
    <xsl:variable name="dt" select="dateTime($dd, $tt)"/>
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:value-of select="format-dateTime($dt,
        '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:transform>

顺便说一下:<xsl:text>{$dateparam}</xsl:text>无效。

改为使用<xsl:value-of select="$dateparam"/>

答案 1 :(得分:1)

要获得您要求的输出,您只需将xsl:variable更改为:

<xsl:variable name="dateparam" select="/properties/entry[@key='date']"/>

但是,请求的输出(11-15-2017T22:45:59Z)不是有效的dateTime。

这就是我要做的事情:

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:variable name="dateparam" select="/properties/entry[@key='date']"/>

  <xsl:template match="entry[@key='date']">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:value-of select="replace(normalize-space($dateparam),
        '^(\d{2})-(\d{2})-(\d{4})\s+(.*)','$3-$1-$2T$4Z')"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<properties>
   <entry key="date">2017-11-15T22:45:59Z</entry>
</properties>