需要一个XSL来更新xml的datetime属性值

时间:2017-07-31 07:25:01

标签: c# xml xslt

这是我的源XML:

<Chat>
  <Chat StartTime="2017-05-28T02:05:52"> 
    <message userId="02A0592964A8F75F" timeShift="4">
      <msgText> Hi </msgText> 
    </message>
    <message userId="123458566666666B"  timeShift="30"> 
      <msgText> Hello.. How can I Help You. ? </msgText> 
    </message>
</Chat>

我需要一个XSL来将源代码转换为:

 <Chats>
     <message time="2017-05-28T02:05:56" userId="02A0592964A8F75F">Hi</message>
     <message time="2017-05-28T02:06:32" userId="02A0592964A8F75F">Hello.. How can I Help You. ?</message> 
 </Chats>

在输出XML文件中,应使用基于TimeShift(秒)的StartTime更新消息时间。

1 个答案:

答案 0 :(得分:0)

如果可以使用XSLT 2.0,那么您的转换将如下所示:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" extension-element-prefixes="xs">
  <xsl:output indent="yes"/>
  <xsl:template match="/">
    <Chats>
      <xsl:variable name="timeShift" select="Chat/@StartTime"/>
      <xsl:for-each select="Chat/message">
        <message>
          <xsl:attribute name="time">
            <xsl:value-of select="xs:dateTime($timeShift) + xs:dayTimeDuration(concat('PT', @timeShift,'S'))"/>
          </xsl:attribute>
          <xsl:attribute name="userId">
            <xsl:value-of select="@userId"/>
          </xsl:attribute>
          <xsl:value-of select="msgText"/>
        </message>
      </xsl:for-each>
    </Chats>
  </xsl:template>
</xsl:stylesheet>

它产生以下结果:

<Chats>
   <message time="2017-05-28T02:05:56" userId="02A0592964A8F75F"> Hi </message>
   <message time="2017-05-28T02:06:22" userId="123458566666666B"> Hello.. How can I Help You. ? </message>
</Chats>

与你的有点不同:

<Chats>
     <message time="2017-05-28T02:05:56" userId="02A0592964A8F75F">Hi</message>
     <message time="2017-05-28T02:06:32" userId="02A0592964A8F75F">Hello.. How can I Help You. ?</message> 
 </Chats>

所以我有一个问题。您是否需要从StartTime或上一条消息转移?