2015-02-23 177 views
0

運行下面的並獲取底部的輸出。具有黑色背景的列活動正確名稱手動添加以提供期望的輸出活動名稱此時產生錯誤值的列。我想實施以下邏輯。在XSLT中執行查找

僞;

  • 選擇記錄其中級別 ==開始
    • 設置ActivityName = 說明
    • 捕捉ActivityIdActivityName到內存中以便日後查找
  • 基於捕獲的記錄,其中ActivityId每條記錄​​的ActivityName匹配

你也可以在.NET Fiddle找到C#完成邏輯

XML

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl" ?> 
<root> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Information">0</SubType> 
     <Correlation ActivityID="a54221e2-ad37-434a-8f0d-101f7abc2221" /> 
    </System> 
    <ApplicationData>Test21</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Information">0</SubType> 
     <Correlation ActivityID="d30741c2-da73-434a-8f0d-101f7ceb2228" /> 
    </System> 
    <ApplicationData>Test24</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Start">0</SubType> 
     <Correlation ActivityID="00000000-0000-0000-0000-000000000000" /> 
    </System> 
    <ApplicationData>Alpha</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Information">0</SubType> 
     <Correlation ActivityID="00000000-0000-0000-0000-000000000000" /> 
    </System> 
    <ApplicationData>Test31</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Verbose">0</SubType> 
     <Correlation ActivityID="3b081a36-43d5-4ecc-b381-628c33316205" /> 
    </System> 
    <ApplicationData>Test51</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Start">0</SubType> 
     <Correlation ActivityID="aa5a5b9c-4b24-43af-9f49-32656385e17d" /> 
    </System> 
    <ApplicationData>Bravo</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Start">0</SubType> 
     <Correlation ActivityID="d30741c2-da73-434a-8f0d-101f7ceb2228" /> 
    </System> 
    <ApplicationData>Charlie</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Error">0</SubType> 
     <Correlation ActivityID="aa5a5b9c-4b24-43af-9f49-32656385e17d" /> 
    </System> 
    <ApplicationData>Test71</ApplicationData> 
</E2ETraceEvent> 
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
    <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
     <SubType Name="Transfer">0</SubType> 
     <Correlation ActivityID="00000000-0000-0000-0000-000000000000" /> 
    </System> 
    <ApplicationData>Test41</ApplicationData> 
</E2ETraceEvent>  
</root> 

XSLT

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:te="http://schemas.microsoft.com/2004/06/E2ETraceEvent" 
       xmlns:s="http://schemas.microsoft.com/2004/06/windows/eventlog/system" 
       xmlns:sd="http://schemas.microsoft.com/2004/08/System.Diagnostics" 
       xmlns:tr="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" 
       exclude-result-prefixes="te s sd tr"> 
    <xsl:output method="html" indent="no"/> 

    <xsl:template match="/"> 
     <html> 
      <head>     
      </head> 
      <body> 
       <div> 
        <div> 
        <table> 
         <thead> 
          <tr>         
           <th>Description</th> 
           <th>Level</th> 
           <th>Activity Name</th> 
           <th>Activity ID</th> 
          </tr> 
         </thead> 
         <tbody>      
          <xsl:for-each select="//te:E2ETraceEvent"> 

          <xsl:variable name="level"> 
           <xsl:value-of select=".//s:SubType/@Name"/> 
          </xsl:variable> 

          <xsl:variable name="description"> 
           <xsl:value-of select=".//te:ApplicationData/text()"/> 
          </xsl:variable> 

          <tr> 
           <!-- APPLICATION DATA --> 
           <td> 
            <xsl:value-of select="$description"/> 
           </td> 

           <!-- LEVEL --> 
           <td> 
            <xsl:value-of select="$level"/>          
           </td> 

           <!-- ACTIVITY NAME --> 
           <td> 
            <xsl:value-of select="((. | preceding-sibling::te:E2ETraceEvent)[s:System/s:SubType/@Name='Start'])[last()]/te:ApplicationData"/> 
           </td> 

           <!-- ACTIVITY ID --> 
           <td> 
            <xsl:value-of select=".//s:Correlation/@ActivityID"/>          
           </td> 
          </tr> 
         </xsl:for-each> 
         </tbody> 
        </table> 
        </div> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

result

回答

0

你的僞代碼是一個有點神祕(像有沒有記錄,其中等級==開始)。另外,XSLT不能這樣工作。在XSLT中,使用key來完成查找。

嘗試添加以下內容到樣式表的頂層:

<xsl:key name="start" match="te:E2ETraceEvent[s:System/s:SubType/@Name='Start']" use="s:System/s:Correlation/@ActivityID" /> 

,然後將此列添加到您的表:

<td> 
    <xsl:value-of select="key('start', s:System/s:Correlation/@ActivityID)/te:ApplicationData"/>  
</td> 
+0

我不知道你是什麼意思是「不存在記錄Level == Start「我有3個[這裏](http://i.imgur.com/wXV3xIa.png)。無論如何,我非常感謝您的時間和關注。它像一個魅力。謝謝! – cilerler 2015-02-23 14:06:26

+0

我的意思是在你的輸入中沒有名爲「Level」的屬性。 $ level是你在輸出端定義的東西 - 但你不能用它來識別原始輸入中的節點。 – 2015-02-23 14:16:42

+0

哦,我明白了。我的不好,因爲我已經在XSLT中實現了_ $ level_,所以我引用了它來簡化它。但你是對的,我也應該說。謝謝。 – cilerler 2015-02-23 14:20:23