Customizing the XSLT definition file in Lync Server 2013
Topic Last Modified: 2014-09-11
The Compliance service records and archives data related to each Lync Server 2013, Persistent Chat Server conversation, including when a participant:
Joins a Persistent Chat room
Leaves a chat room
Posts a message
Views chat history
Uploads a file
Downloads a file
The data is delivered as XML, which you can transform into the format that best fits your organization, by using an XSLT definition file. This topic describes the XML file that the Compliance service creates. It also provides samples of XSLT definition and output files.
Output Format
The Compliance service output is categorized by conversation (the Conversation element) and then by message (the Messages element), as shown in the following code sample.
<?xml version="1.0" encoding="utf-8" ?>
<Conversations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Conversation>
<Channel uri="ma-chan://litwareinc.com/300" name="ma-chan://litwareinc.com/300" islogged="" />
<!--FirstMessage goes here --!>
<Messages>
<!—Messages go here--!>
</Messages>
<StartTimeUTC since1970="1212610540953" string="2008-06-04T20:15:40.9535482Z" long="633482073409535482" />
<EndTimeUTC since1970="1212610602532" string="2008-06-04T20:16:42.5324614Z" long="633482074025324614" />
</Conversation>
</Conversations>
A Conversation element contains four elements (Channel, FirstMessage, StartTimeUTC, and EndTimeUTC). The Channel element contains the Uniform Resource Identifier (URI) of the chat room, and the FirstMessage element describes the first message in the Messages element. The StartTimeUTC and EndTimeUTC elements provide the start and end times for the conversation, as shown in the following code sample.
<<FirstMessage type="JOIN" content="" id="0">
<Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" />
<DateTimeUTC since1970="1212610540953" string="2008-06-04T20:15:40.9535482Z" long="633482073409535482" />
</FirstMessage>
A Message element contains two elements (Sender and DateTimeUTC) and three attributes (Type, Content, and ID). The Sender element represents the user who sends the message, and the DateTimeUTC element represents when an event occurs, as shown in the following code sample.
<Message type="JOIN" content="" id="0">
<Sender UserName="TestUser kazuto" id="10" email="kazuto@litwareinc.com" internal="true" uri="kazuto@litwareinc.com" />
<DateTimeUTC since1970="1206211842612" string="2008-03-22T18:50:42.6127374Z" long="633418086426127374" />
</Message>
The following table describes the message attributes Type, Content, and ID.
Messages Element Attributes
Attribute | Description | Optional/Required |
---|---|---|
Type |
Specifies the message type. The message types are described in the Message Elements Message Types table. |
Required |
Content |
Contains the content of the message. Messages with a Type of Join or Part do not use this attribute. |
Optional |
ID |
Specifies the unique ID of the content. This attribute is used only with messages with a Type of Chat. |
Optional |
Each Sender element contains five attributes: the user name, ID, email, internal, and URI. These attributes are described in the following table.
Sender Element Attributes
Attribute | Description | Optional/Required |
---|---|---|
Username |
The name of the sender. |
Optional |
ID |
The sender’s unique ID. |
Required |
The sender’s email address. |
Optional |
|
Internal |
Determines whether the user is an internal user or a federated user. If the value is set to true, the user is internal. |
Optional |
Uri |
The user’s SIP URI. |
Required |
The following table describes the message types that the Messages element can contain. It also provides examples of how each element is used.
Message Element Message Types
Message Type | Description | Code example |
---|---|---|
Join |
A user joins a chat room. |
|
Part |
A user leaves a chat room. |
|
Chat |
The sender’s email address. |
|
Backchat |
A user requests content from chat history. |
|
File upload |
A user uploads a file. |
|
File download |
A user downloads a file. |
|
Default Persistent Chat Output XSD and Example XSL Transform
The following code sample contains the default output from the Compliance Server.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Conversations" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:simpleType name="ComplianceMessageType">
<xs:restriction base="xs:string">
<xs:enumeration value="JOIN"/>
<xs:enumeration value="PART"/>
<xs:enumeration value="CHAT"/>
<xs:enumeration value="BACKCHAT"/>
<xs:enumeration value="FILEUPLOAD"/>
<xs:enumeration value="FILEDOWNLOAD"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Sender">
<xs:complexType>
<xs:attribute name="UserName" type="xs:string" />
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="email" type="xs:string" use="optional" />
<xs:attribute name="internal" type="xs:boolean" use="optional" >
<xs:annotation><xs:documentation>If the user is internal or federated</xs:documentation></xs:annotation>
</xs:attribute>
<xs:attribute name="uri" type="xs:anyURI" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="DateTimeUTC">
<xs:complexType>
<xs:attribute name="since1970" type="xs:long" />
<xs:attribute name="string" type="xs:string" />
<xs:attribute name="long" type="xs:long" />
</xs:complexType>
</xs:element>
<xs:element name="Conversations" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="Sender" />
<xs:element ref="DateTimeUTC" />
<xs:element name="Conversation">
<xs:complexType>
<xs:sequence>
<xs:element name="Channel" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="uri" type="xs:anyURI" />
<xs:attribute name="name" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="FirstMessage" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element ref="Sender" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="DateTimeUTC" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="type" type="ComplianceMessageType" />
<xs:attribute name="content" type="xs:string" />
<xs:attribute name="id" type="xs:int" />
</xs:complexType>
</xs:element>
<xs:element name="Messages" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Message" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element ref="Sender" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="DateTimeUTC" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="type" type="ComplianceMessageType" />
<xs:attribute name="content" type="xs:string" />
<xs:attribute name="id" type="xs:int" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="StartTimeUTC" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="since1970" type="xs:long" />
<xs:attribute name="string" type="xs:string" />
<xs:attribute name="long" type="xs:long" />
</xs:complexType>
</xs:element>
<xs:element name="EndTimeUTC" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="since1970" type="xs:long" />
<xs:attribute name="string" type="xs:string" />
<xs:attribute name="long" type="xs:long" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
The following code sample contains a sample XSL transform.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<FileDump>
<xsl:apply-templates />
</FileDump>
</xsl:template>
<xsl:template match="Conversation">
<xsl:variable name="chanName" select="Channel/@name" />
<Conversation Perspective="{$chanName}_group_channel">
<RoomID><xsl:value-of select="Channel/@name" /></RoomID>
<StartTimeUTC><xsl:value-of select="StartTimeUTC/@since1970" /></StartTimeUTC>
<xsl:apply-templates />
<EndTimeUTC><xsl:value-of select="EndTimeUTC/@since1970" /></EndTimeUTC>
</Conversation>
</xsl:template>
<xsl:template match="Message">
<xsl:choose>
<xsl:when test="@type='JOIN'">
<ParticipantEntered>
<xsl:call-template name="DateTimeAndLogin" />
<InternalFlag><xsl:value-of select="Sender/@internal" /></InternalFlag>
<ConversationID><xsl:value-of select="../../Channel/@name" /></ConversationID>
<CorporateEmailID><xsl:value-of select="Sender/@email" /></CorporateEmailID>
</ParticipantEntered>
</xsl:when>
<xsl:when test="@type='PART'">
<ParticipantLeft>
<xsl:call-template name="DateTimeAndLogin" />
<InternalFlag><xsl:value-of select="Sender/@internal" /></InternalFlag>
<ConversationID><xsl:value-of select="../../Channel/@name" /></ConversationID>
<CorporateEmailID><xsl:value-of select="Sender/@email" /></CorporateEmailID>
</ParticipantLeft>
</xsl:when>
<xsl:when test="@type='FILEUPLOAD' or @type='FILEDOWNLOAD'">
<FileTransferStarted>
<xsl:call-template name="DateTimeAndLogin" />
<FileName><xsl:value-of select="@content" /></FileName>
</FileTransferStarted>
<FileTransferEnded>
<xsl:call-template name="DateTimeAndLogin" />
<FileName><xsl:value-of select="@content" /></FileName>
<Status>Completed</Status>
</FileTransferEnded>
</xsl:when>
<xsl:when test="@type='CHAT' or @type='BACKCHAT'">
<Message>
<xsl:call-template name="DateTimeAndLogin" />
<Content><xsl:value-of select="@content" /></Content>
</Message>
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
<xsl:template name="DateTimeAndLogin">
<LoginName><xsl:value-of select="Sender/@userName" /></LoginName>
<DateTimeUTC><xsl:value-of select="DateTimeUTC/@since1970" /></DateTimeUTC>
</xsl:template>
</xsl:stylesheet>