2011-07-14 38 views
2

我從我寫的程序中獲得XML中的以下調試轉儲。我想把這個格式化爲一個表格,並且嵌套了子例外(我還沒有得到這個)。 我是XSL(T)的新手,所以請耐心等待。 我有三個文件debug.xml,debug.xsl和table.css。 underneat用於顯示沒有父級的子節點的XML

XML文件

<?xml version="1.0" encoding="ISO8859-1" ?> 
<?xml-stylesheet type="text/xsl" href="debug.xsl"?> 
<Root> 
<Exception> 
    <Type>DuplicateKeyPairException1</Type> 
    <Message>Duplicate in the key/section pair found in the file. - [THRUSTERS/NRTHRUSTERS] already has a value.</Message> 
    <Source>WindowsFormsApplication1</Source> 
    <StackTrace> at IniParser..ctor(String iniPath) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\IniParser.cs:line 110 
    at CIniFile.Open(String sFileName) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\FileParser.cs:line 115 
    at CIniFile..ctor(String sFilename) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\FileParser.cs:line 109 
    at ScriptHost.RequestDocument(String qualifiedPath, enumFileType filetype) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\ScriptHost.cs:line 55</StackTrace> 
    <TargetSite>Void .ctor(System.String)</TargetSite> 
    <Data> 
    <VSSFullPath>c:\vss\ERROR\vss\SRCSAFE.INI</VSSFullPath> 
    <VSSFilename>xxx.ini</VSSFilename> 
    </Data> 
<Exception> 
    <Type>System.ArgumentException</Type> 
    <Message>Item has already been added. Key in dictionary: 'IniParser+SectionPair' Key being added: 'IniParser+SectionPair'</Message> 
    <Source>mscorlib</Source> 
    <StackTrace> at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 
    at System.Collections.Hashtable.Add(Object key, Object value) 
    at IniParser..ctor(String iniPath) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\IniParser.cs:line 95</StackTrace> 
    <TargetSite>Void Insert(System.Object, System.Object, Boolean)</TargetSite> 
</Exception> 
</Exception> 
<Exception> 
    <Type>DuplicateKeyPairException2</Type> 
    <Message>Duplicate in the key/section pair found in the file. - [THRUSTERS/NRTHRUSTERS] already has a value.</Message> 
    <Source>WindowsFormsApplication1</Source> 
    <StackTrace> at IniParser..ctor(String iniPath) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\IniParser.cs:line 110 
    at CIniFile.Open(String sFileName) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\FileParser.cs:line 115 
    at CIniFile..ctor(String sFilename) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\FileParser.cs:line 109 
    at ScriptHost.RequestDocument(String qualifiedPath, enumFileType filetype) in C:\Programming\CSharp\VisualSourceSafeInterface\Test2\WindowsFormsApplication1\WindowsFormsApplication1\ScriptHost.cs:line 55</StackTrace> 
    <TargetSite>Void .ctor(System.String)</TargetSite> 
    <Data> 
    <VSSFullPath>c:\vss\ERROR\vss\SRCSAFE.INI</VSSFullPath> 
    <VSSFilename>xxx.ini</VSSFilename> 
    </Data> 
</Exception> 
</Root> 

XSL文件

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


    <xsl:template match="/"> 
    <html> 
    <head> 
     <title>Cascading Style Sheet</title> 
    <link rel="stylesheet" type="text/css" href="table.css" title="Style"/> 
    </head> 
    <body> 
      <xsl:for-each select="Root"> 
       <xsl:element name="table"> 
        <xsl:attribute name="border">1</xsl:attribute> 
         <xsl:for-each select="*"> 
          <xsl:apply-templates select="."/> 
         </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
    </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Root/Exception"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
      <xsl:attribute name="colspan">2</xsl:attribute> 
      <xsl:attribute name="class">Exception</xsl:attribute> 
      Exception 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates select="Type"/> 
     <xsl:apply-templates select="Message"/> 
     <xsl:apply-templates select="VSSFullPath"/> 
     <xsl:apply-templates select="VSSFilename"/> 
     <xsl:apply-templates select="Source"/> 
     <xsl:apply-templates select="TargetSite"/> 
     <xsl:apply-templates select="StackTrace"/> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Exception/Exception"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
      <xsl:attribute name="colspan">2</xsl:attribute> 
      <xsl:attribute name="class">Exception</xsl:attribute> 
      SUB Exception 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates select="Type"/> 
     <xsl:apply-templates select="Message"/> 
     <xsl:apply-templates select="Data"/> 
     <xsl:apply-templates select="Source"/> 
     <xsl:apply-templates select="TargetSite"/> 
     <xsl:apply-templates select="StackTrace"/> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Type"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Type 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Message"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Message 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Source"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Source 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="TargetSite"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       TargetSite 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="StackTrace"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       StackTrace 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <!--Print data in a new table inside the cell--> 
    <xsl:template match="Data"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Data 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:element name="table"> 
       <xsl:attribute name="border">1</xsl:attribute> 
        <xsl:for-each select="*"> 
         <xsl:element name="tr"> 
          <xsl:element name="th"> 
           <xsl:value-of select="local-name()"/> 
          </xsl:element> 
          <xsl:element name="td"> 
            <xsl:value-of select="."/> 
          </xsl:element> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="VSSFilename"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       VSS File 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

       <!--Sub Exceptions 
       <xsl:for-each select="child::Exception"> 
        <xsl:element name="tr"> 
         <xsl:element name="th"> 
          Nested Exception 
         </xsl:element> 
         <xsl:element name="td"> 
          <xsl:value-of select="." /> 
         </xsl:element> 
        </xsl:element> 
       </xsl:for-each>--> 
</xsl:stylesheet> 

CSS-文件顯示

table 
{text-align: left; 
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif ; 
font-weight: normal; 
font-size: 11px; 
color: #fff; 
width: 420px; 
background-color: #666; 
border: 0px; 
border-collapse: collapse; 
border-spacing: 0px;} 

th { 
    font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, 
    sans-serif; 
    color: #6D929B; 
    border-right: 1px solid #C1DAD7; 
    border-bottom: 1px solid #C1DAD7; 
    border-top: 1px solid #C1DAD7; 
    letter-spacing: 2px; 
    text-transform: uppercase; 
    text-align: left; 
    padding: 6px 6px 6px 12px; 
    background: #CAE8EA url(images/bg_header.jpg) no-repeat; 
} 


th.Exception 
{ 
    border-right: 1px solid #D7DAC1; 
    border-bottom: 1px solid #D7DAC1; 
    border-top: 1px solid #D7DAC1; 
    border-top: 0; 
    border-left: 0; 
    border-right: 1px solid #D7DAC1; 
    background: #EAE8CA; 
} 

td { 
font-weight: bold; 
    border-right: 1px solid #C1DAD7; 
    border-bottom: 1px solid #C1DAD7; 
    background: #fff; 
    padding: 6px 6px 6px 12px; 
    color: #6D929B; 
} 


td.alt { 
    background: #F5FAFA; 
    color: #B4AA9D; 
} 

我的結果顯示異常,但它也顯示了樣式第二次子節點 ,所以我在列表中得到了一組雙重異常子。 PS這是正在進行中的工作,如果您發現任何問題,我真的很感激,如果您給我提示或指示什麼是錯誤或不正確的做法。 我明白爲什麼會發生,因爲它運行所有模板,但不知道如何阻止它發生。

在此先感謝您的幫助。

+0

+1對於詳細的問題和努力。 –

回答

1

我的結果顯示異常,但它也顯示了子節點的樣式的第二次,所以我得到一個雙套異常兒童在列表中。

的不必要的重複被的xsl:apply-templates一個錯誤的用法在XSLT引起的。

通常情況下,在同一個序列構造,您可以使用xsl:apply-templatesselect或不select,不能同時

例如,下面的代碼:

<xsl:apply-templates select="Type"/> 
    <xsl:apply-templates select="Message"/> 
    <xsl:apply-templates select="VSSFullPath"/> 
    <xsl:apply-templates select="VSSFilename"/> 
    <xsl:apply-templates select="Source"/> 
    <xsl:apply-templates select="TargetSite"/> 
    <xsl:apply-templates select="StackTrace"/> 
    <xsl:apply-templates /> 

應該與改變:

<xsl:apply-templates /> 

該指令,沒有select你默認應用模板上下文節點的所有子

要獲得想要的結果,您需要在模板Root/ExceptionException/Exception模板中僅使用<xsl:apply-templates />。這是因爲很顯然你希望模板與所有的孩子結盟。


PS:通過刪除不需要的xsl:for-each,可以真正改善您的代碼。例如,這是你(讓我說驚人)迭代:

<xsl:for-each select="*"> 
    <xsl:apply-templates select="."/> 
    </xsl:for-each> 

是邏輯上等同於:

<xsl:apply-templates /> 
+0

'舉例來說,這是你的(讓我說驚人的)迭代:' - 他他很棒的評論。感謝您的幫助。它正在工作。 – schultz

+0

@Schultz,歡迎來到SO。確保[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)這是最有用的解決您的問題。 –

+0

yep不知道那個。現在已被接受。 – schultz

0

您的解決方案只是修改:

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


    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Cascading Style Sheet</title> 
       <link rel="stylesheet" type="text/css" href="table.css" title="Style"/> 
      </head> 
      <body> 
       <table border="1"> 
        <xsl:apply-templates select="Root/Exception"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="Root/Exception"> 
     <tr> 
      <th colspan="2" class="Exception">Exception</th> 
     </tr> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Exception/Exception"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       <xsl:attribute name="colspan">2</xsl:attribute> 
       <xsl:attribute name="class">Exception</xsl:attribute> 
       SUB Exception 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Type"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Type 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Message"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Message 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Source"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Source 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="TargetSite"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       TargetSite 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="StackTrace"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       StackTrace 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <!--Print data in a new table inside the cell--> 
    <xsl:template match="Data"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       Data 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:element name="table"> 
        <xsl:attribute name="border">1</xsl:attribute> 
        <xsl:for-each select="*"> 
         <xsl:element name="tr"> 
          <xsl:element name="th"> 
           <xsl:value-of select="local-name()"/> 
          </xsl:element> 
          <xsl:element name="td"> 
           <xsl:value-of select="."/> 
          </xsl:element> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="VSSFilename"> 
     <xsl:element name="tr"> 
      <xsl:element name="th"> 
       VSS File 
      </xsl:element> 
      <xsl:element name="td"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 

    <!--Sub Exceptions 
       <xsl:for-each select="child::Exception"> 
        <xsl:element name="tr"> 
         <xsl:element name="th"> 
          Nested Exception 
         </xsl:element> 
         <xsl:element name="td"> 
          <xsl:value-of select="." /> 
         </xsl:element> 
        </xsl:element> 
       </xsl:for-each>--> 
</xsl:stylesheet> 

你也可以簡單地寫

<table border="1"> 

<xsl:element name="table"> 
    <xsl:attribute name="border">1</xsl:attribute> 

以提高可讀性。

+0

由於我在答案中解釋的原因,此代碼仍將顯示_subexception_部分輸出的重複項。 –

+0

@empo,對。忘記刪除'Exception/Exception' –

+0

@polishchuk,謝謝你對的信息我將不得不堅持使用 kind。 – schultz

1

審查樣式表無法抗拒。

這裏53行與原來的。

乾杯。

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

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Cascading Style Sheet</title> 
       <link rel="stylesheet" type="text/css" href="table.css" title="Style"/> 
      </head> 
      <body> 
       <table border="1"> 
        <xsl:apply-templates /> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="Exception[parent::Root]"> 
     <tr> 
      <th colspan="2" class="Exception">Exception</th> 
     </tr> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Exception[parent::Exception]"> 
     <tr> 
      <th colspan="2" class="Exception">SUB Exception</th> 
     </tr> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Data"> 
     <tr> 
      <th>Data</th> 
      <td> 
       <table border="1"> 
         <xsl:apply-templates/> 
       </table> 
      </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="Type|Message|Source|TargetSite|StackTrace|VSSFilename|VSSFullPath"> 
     <tr> 
      <th> 
       <xsl:value-of select="name()"/> 
      </th> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 
相關問題