这个问题的独特之处在于,我看到了两个相似的答案 - 而这些答案并没有解决我的问题。我希望将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。
答案 0 :(得分:0)
熟悉以下功能的描述:
substring
- 获取字符串的一部分,xs:time(timestring)
- 将字符串转换为 xs:time 类型,format-time
- 从 xs:time 变量中获取格式化字符串。如果您打算对时间值执行某些计算,上述功能可能会很有用。
另一个解决方案是从源字符串中提取所需的子字符串(例如,小时,分钟
和第二部分)使用substring
函数。
然后,您可以使用concat
函数创建输出字符串。
我创建了一个下面给出的例子。
<?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中。