2017-02-07 15 views
0

私はXSLTで新しく、私の現在の例からすべての情報を抜き出すのに問題があります。異なるxml xpathの情報にアクセスし、複数の同じパスを表示

以下の例では、メッセージを表示してテキストのプロパティに気づくことにも興味があり、見て分かるように、ノードも繰り返されています。この情報を手に入れてください。

<?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> 

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

    <message userId="007957F616780001" timeShift="5" visibility="ALL" eventId="2"> 
     <msgText msgType="text" treatAs="NORMAL">This is message two.</msgText> 
    </message> 

    <notice userId="007957F616780001" timeShift="246" visibility="ALL" eventId="3"> 
     <noticeText noticeType="USER_CUSTOM">This is notice one.</noticeText> 
    </notice> 

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

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

</chatTranscript> 

とXSL:

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

    <xsl:output method="text"/> 

    <xsl:template match="/chatTranscript/newParty[count(*) > 1]"> 
     <xsl:variable name="curParty" select="@userId" /> 
      GMSServiceId - <xsl:value-of select="userData/item[@key='GMSServiceId']"/> 
      IdentifyCreateContact: <xsl:value-of select="userData/item[@key='IdentifyCreateContact']"/> 
      MediaType: <xsl:value-of select="userData/item[@key='MediaType']"/> 
      firstName: <xsl:value-of select="userData/item[@key='firstName']"/> 
      userDisplayName: <xsl:value-of select="userData/item[@key='userDisplayName']"/> 
    </xsl:template> 

    <xsl:template match="/chatTranscript/message[count(*) > 1]"> 
     <xsl:variable name="curParty" select="@userId" /> 
     Message Text: <xsl:value-of select="msgText"/> 
    </xsl:template> 

    <xsl:template match="text()" /> 

</xsl:stylesheet> 

電流出力は次のようになります。もちろん

GMSServiceId - 5954d184-f89d-4f44-8c0f-a772d458b353 IdentifyCreateContact: 3 MediaType: chat firstName: John userDisplayName: John Doe 

私はこのリストにメッセージテキストと通知テキストを追加したいと思います。

私は現時点で何を投げているのかというと、2つのケースのxmlの構造が異なっているという事実です。(メッセージと通知に使用される)2番目のケースの処理方法はわかりません。

+1

与えられた例で得られると思われる正確な出力を表示してください。 –

+0

そして入力XMLを修正できますか?ルート要素がないので、[well-formed](https://www.w3.org/TR/REC-xml/#dt-wellformed)ではありません。 –

答えて

0

私はあなたが得ることを期待する正確に何かわからないが、それは、テンプレートことは注目に値します:あなたの例では、すべてのmessage要素は正確に一つの子要素を持っているので

<xsl:template match="/chatTranscript/message[count(*) > 1]"> 

は、まったく実行されません。述語を削除すると、結果は次のようになります。

GMSServiceId - 5954d184-f89d-4f44-8c0f-a772d458b353 
    IdentifyCreateContact: 3 
    MediaType: chat 
    firstName: John 
    userDisplayName: John Doe 
Message Text: This is message one. 
Message Text: This is message two. 
+0

あなたの例のように、メッセージとその後の通知を印刷しようとしています。 行とその末尾を削除するとエラーが発生するため、述語を削除しました。 – Harriet

+0

@ハリエット*述語*は角括弧内の部分です。 –

+0

ええ、私は知っている - しかし、XMLタグには開始タグと終了タグがあります。両方を削除しても機能しませんでした。私はそれが働いても心配しないでください。 – Harriet

関連する問題