如何在xsl中格式化数字到日期时间格式?

时间:2017-02-10 12:50:35

标签: xml xslt

这个问题的独特之处在于,我看到了两个相似的答案 - 而这些答案并没有解决我的问题。我希望将timeShift字段作为文本值添加到html中,而不是作为标记的属性。

我有以下xml,并希望在timeShift字段上进行一些时间操作,以使其格式为:HH:MM:SS。

我怎样才能在xsl中执行此操作?

以下是我当前的xsl文件:

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

<xsl:strip-space elements="*"/>

<xsl:key name="party" match="newParty" use="@userId" />

<xsl:template match="/chatTranscript">
    <html>
        <head><link rel="stylesheet" type="text/css" href="/webrecall/css/chat.css"/></head>
        <header>Chat - <xsl:value-of select="@sessionId" /> - <xsl:value-of select="@startAt" /></header>
        <xsl:apply-templates/>
    </html>
</xsl:template>

<xsl:template match="newParty[userInfo/@userType='CLIENT']">
    <div class="ClientJoined" id="{@userId}">
        <label>Client: <xsl:value-of select="userInfo/@userNick" /></label>
        <label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>
      </div>
</xsl:template>

<xsl:template match="newParty[userInfo/@userType='AGENT']">
    <div class="AgentJoined" id="{@userId}">
        <label>Agent: <xsl:value-of select="userInfo/@userNick" /></label>
        <label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>
    </div>
</xsl:template> 

<xsl:template match="message">
    <xsl:variable name="party-class">
        <xsl:call-template name="lookup-class"/>
    </xsl:variable>
    <div class="Messages {$party-class}" id="{@eventId}">
        <label><xsl:value-of select="msgText" /></label>
        <label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>
    </div>
</xsl:template>   
<xsl:template match="notice">
    <xsl:variable name="party-class">
        <xsl:call-template name="lookup-class"/>
    </xsl:variable>
    <div class="Notices {$party-class}" id="{@eventId}">
        <label><xsl:value-of select="noticeText" /></label>
        <label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>
    </div>
</xsl:template>

<xsl:template match="partyLeft">
    <xsl:variable name="party-class">
        <xsl:call-template name="lookup-class"/>
    </xsl:variable>
    <div class="Notices {$party-class}" id="{@eventId}">
        <label><xsl:value-of select="reason" /></label>
        <label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>
    </div>
</xsl:template>

<xsl:template name="lookup-class">
    <xsl:variable name="party-type" select="key('party', @userId)/userInfo/@userType" />
    <xsl:choose>
        <xsl:when test="$party-type='CLIENT'">Client</xsl:when>
        <xsl:when test="$party-type='AGENT'">Agent</xsl:when>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

以下是xml:

    <?xml version="1.0"?><chatTranscript startAt="2015-06-04T09:07:40Z" sessionId="0003CaANX11G00HD">
    <newParty userId="00955570155B0000" eventId="1" timeShift="0" visibility="ALL">
        <userInfo personId="" userNick="PhilC" userType="CLIENT" protocolType="FLEX" timeZoneOffset="120"/>
        <userData>
            <item key="EmailAddress"/>
            <item key="FirstName">Phil</item>
            <item key="IdentifyCreateContact">3</item>
            <item key="LastName">Collins</item>
            <item key="MediaType">chat</item>
        </userData>
    </newParty>
    <newParty userId="0095557015600002" eventId="2" timeShift="4" visibility="ALL">
        <userInfo personId="" userNick="system" userType="EXTERNAL" protocolType="ESP" timeZoneOffset="0"/>
    </newParty>
    <message userId="0095557015600002" eventId="3" timeShift="4" visibility="ALL">
        <msgText>agent will be with you shortly</msgText>
    </message>
    <newParty userId="00955570156E0003" eventId="4" timeShift="19" visibility="ALL">
        <userInfo personId="emailqa" userNick="emailqa" userType="AGENT" protocolType="BASIC" timeZoneOffset="120"/>
    </newParty>
    <message userId="00955570155B0000" eventId="6" timeShift="22" visibility="ALL">
        <msgText msgType="text" treatAs="NORMAL">hellO?</msgText>
    </message>
    <message userId="00955570156E0003" eventId="9" timeShift="26" visibility="ALL">
        <msgText treatAs="NORMAL">hi Phil</msgText>
    </message>
    <message userId="00955570156E0003" eventId="11" timeShift="28" visibility="ALL">
        <msgText treatAs="NORMAL">whatsup?</msgText>
    </message>
    <message userId="00955570155B0000" eventId="14" timeShift="45" visibility="ALL">
        <msgText msgType="text" treatAs="NORMAL">we're sitting next to each other but we're sending IMs  </msgText>
    </message>
    <message userId="00955570156E0003" eventId="17" timeShift="54" visibility="ALL">
        <msgText treatAs="NORMAL">hehehe</msgText>
    </message>
    <message userId="00955570156E0003" eventId="19" timeShift="56" visibility="ALL">
        <msgText treatAs="NORMAL">indeed</msgText>
    </message>
    <partyLeft userId="00955570156E0003" askerId="00955570156E0003" eventId="21" timeShift="77" visibility="ALL">
        <reason code="1">left with request to close if no agents</reason>
    </partyLeft>
    <partyLeft userId="00955570155B0000" askerId="00955570156E0003" eventId="22" timeShift="77" visibility="ALL">
        <reason code="4">removed by other party</reason>
    </partyLeft>
</chatTranscript>

所以问题是如何将timeShift整数值作为输入(表示以秒为单位的时间),并将其设置为持续时间,格式为HH:mm:ss。

1 个答案:

答案 0 :(得分:0)

熟悉以下功能的描述:

  • substring - 获取字符串的一部分,
  • xs:time(timestring) - 将字符串转换为 xs:time 类型,
  • format-time - 从 xs:time 变量中获取格式化字符串。

如果您打算对时间值执行某些计算,上述功能可能会很有用。

另一个解决方案是从源字符串中提取所需的子字符串(例如,小时,分钟 和第二部分)使用substring函数。 然后,您可以使用concat函数创建输出字符串。

编辑截至2017年2月13日

我创建了一个下面给出的例子。

<?xml version="1.0" encoding="UTF-8"?>
<Main>
  <Record timeShift="17" cause="A1">Abcd efgh ijlk</Record>
  <Record timeShift="85" cause="A2">Mnop qrst uvw xyz</Record>
</Main>

下面是一个示例XSL,将timeShift属性转换为mm:ss格式。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>

  <xsl:template match="@timeShift">
    <xsl:attribute name="timeShift">
      <xsl:call-template name="format-duration"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template name="format-duration">
    <xsl:param name="value" select="." />
    <xsl:param name="alwaysIncludeHours" select="false()" />
    <xsl:param name="includeSeconds" select="true()" />

    <xsl:if test="$value > 3600 or $alwaysIncludeHours">
      <xsl:value-of select="concat(format-number($value div 3600, '00'), ':')"/>
    </xsl:if>
    <xsl:value-of select="format-number($value div 60 mod 60, '00')" />
    <xsl:if test="$includeSeconds">
      <xsl:value-of select="concat(':', format-number($value mod 60, '00'))" />
    </xsl:if>
  </xsl:template>  

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

format-duration模板是从Seconds to Time in XSLT复制的 在这篇文章的评论中提到。

回到你的XSL源:改变

的每个案例
<label class="timeShiftLabel"><xsl:value-of select="@timeShift" /></label>

为:

<label class="timeShiftLabel">
  <xsl:call-template name="format-duration">
    <xsl:with-param name="value" select="@timeShift"/>
    <xsl:with-param name="alwaysIncludeHours" select="true()" />
  </xsl:call-template>
</label>

当然,既然你打电话给format-duration模板,你也应该把它包含在你的XSL中。