2017-02-08 4 views
0

xmlファイルがあります。このファイルには、エージェントとクライアントの間の会話が記述されています。両方の当事者には、newPartyタグで割り当てられたuserIdがあります。xmlタグ間のクロスリファレンスを使用して、クラスプロパティを追加する方法を決定します。

以降のメッセージと注意事項は、このuserIdを参照してください。私はメッセージや通知が処理され、userIdを使って参照が行われ、生成されたHTMLのclassプロパティに文字列 "Agent"または "Client"を追加したいと思います。

<?xml version="1.0"?> 
<chatTranscript startAt="2016-10-06T09:16:40Z" sessionId="0001GaBYC53D000K"> 
<newParty userId="007957F616780001" timeShift="1" visibility="ALL" eventId="1"> 
    <userInfo personId="" userNick="John Doe" userType="CLIENT" protocolType="FLEX" timeZoneOffset="120"/> 
    <userData> 
     <item key="GMSServiceId">5954d184-f89d-4f44-8c0f-a772d458b353</item> 
     <item key="IdentifyCreateContact">3</item> 
     <item key="MediaType">chat</item><item key="TimeZone">120</item> 
     <item key="_data_id">139-e9826bf5-c5a4-40e5-a729-2cbdb4776a43</item> 
     <item key="firstName">John</item><item key="first_name">John</item> 
     <item key="lastName">Doe</item> 
     <item key="last_name">Doe</item> 
     <item key="location_lat">37.8197</item> 
     <item key="location_long">-122.4786</item> 
     <item key="userDisplayName">John Doe</item> 
    </userData> 
</newParty> 

<newParty userId="0079581AF56C0025" timeShift="20" visibility="ALL" eventId="2"> 
    <userInfo personId="1" userNick="allendei" userType="AGENT" protocolType="BASIC" timeZoneOffset="120"/> 
</newParty> 

<message userId="007957F616780001" timeShift="25" visibility="ALL" eventId="3"> 
    <msgText msgType="text" treatAs="NORMAL">This is message one.</msgText> 
</message> 

<message userId="0079581AF56C0025" timeShift="35" visibility="ALL" eventId="4"> 
    <msgText msgType="text" treatAs="NORMAL">This is message two.</msgText> 
</message> 

<notice userId="0079581AF56C0025" timeShift="40" visibility="ALL" eventId="5"> 
     <noticeText noticeType="USER_CUSTOM">This is notice one.</noticeText> 
</notice> 

<notice userId="007957F616780001" timeShift="58" visibility="ALL" eventId="6"> 
    <noticeText noticeType="USER_CUSTOM">This is notice two.</noticeText> 
</notice> 

<partyLeft userId="007957F616780001" timeShift="90" visibility="ALL" eventId="4" askerId="007957F616780001"> 
    <reason code="3">left due to disconnect</reason> 
</partyLeft> 

...と私のXLTは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:template match="/chatTranscript"> 
    <html> 
    <header><xsl:value-of select="@sessionId" /></header> 
    <xsl:apply-templates select="newParty" /> 
    <xsl:apply-templates select="message/msgText" /> 
    <xsl:apply-templates select="notice/noticeText" /> 
    <xsl:apply-templates select="partyLeft/reason" /> 
    </html> 
</xsl:template> 

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

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

<xsl:template match="msgText"> 
    <div class="Messages" id="{../@eventId}"> 
    <label>Message: <xsl:value-of select="text()" /></label> 
    </div> 
</xsl:template> 

<xsl:template match="noticeText"> 
    <div class="Notices" id="{../@eventId}"> 
    <label>Notice: <xsl:value-of select="text()" /></label> 
    </div> 
</xsl:template> 

<xsl:template match="reason"> 
    <div class="Notices" id="{../@eventId}"> 
    <label>Reason: <xsl:value-of select="text()" /></label> 
    </div> 
</xsl:template> 

次のように所望の出力がある - どこクラスのプロパティ(エージェントまたはクライアント)は、上部のnewPartiesのuserIDを使用して検索します。

<html> 
<header>0001GaBYC53D000K</header> 
<div class="Client" id="007957F616780001"><label>Client: John Doe</label></div> 
<div class="Client" id="0079581AF56C0025"><label>Agent: allendei</label></div> 
<div class="Messages,Client" id="3"><label>Message: This is message one.</label></div> 
<div class="Messages,Agent" id="4"><label>Message: This is message two.</label></div> 
<div class="Notices,Agent" id="5"><label>Notice: This is notice one.</label></div> 
<div class="Notices,Client" id="6"><label>Notice: This is notice two.</label></div> 
<div class="Notices,Client" id="4"><label>Reason: left due to disconnect</label></div> 

答えて

1

XSLTは、ルックアップを実行するための組み込みの機構を有しています。次の例に示すようにそれを使用し、次いで

<xsl:key name="party" match="newParty" use="@userId" /> 
:出力がないこと

XSLT 1.0

<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> 
     <header> 
      <xsl:value-of select="@sessionId" /> 
     </header> 
     <xsl:apply-templates/> 
    </html> 
</xsl:template> 

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

<xsl:template match="newParty[userInfo/@userType='AGENT']"> 
    <div class="Client" id="{@userId}"> 
     <label>Agent: <xsl:value-of select="userInfo/@userNick" /></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>Message: <xsl:value-of select="msgText" /></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>Notice: <xsl:value-of select="noticeText" /></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>Reason: <xsl:value-of select="reason" /></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> 

注としてkeyを定義することによって開始します有効なHTML。

+0

あなたの答えをありがとう - それは私のように動作します。実装についての1つの質問 - 私は要素の順序が間違っていたことに気付きましたが、今はあなたの解決策が整えられています。私はEventIdでソートを行う予定でしたが、このソリューションでは必要ないようです。理由を説明してください。 – Harriet

+0

「正しい」注文が何であるか分かりません。上記はソース文書の順序に従います。 –

+0

の前に、私はすべてのメッセージを1つで処理し、次に通知などを与えていました。それについて心配しないでください。どのように要素が木のような構造に処理されることになっているかについて私はそれ以上の研究をします。 – Harriet

関連する問題