home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / WindowsServerTrial / server.iso / sources / install.wim / 2 / Windows / System32 / EventViewer_EventDetails.xsl < prev    next >
Extensible Markup Language  |  2006-09-18  |  18KB  |  514 lines

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5. <!-- The indent for child nodes -->
  6. <xsl:variable name="indent">15</xsl:variable>
  7.  
  8. <!-- The indent for attributes -->
  9. <xsl:variable name="AttributeIndent">12</xsl:variable>
  10.  
  11. <!-- The font and font size to be used. -->
  12. <xsl:variable name="FontFamily">Segoe UI</xsl:variable>
  13. <xsl:variable name="FontFamily_FixWidth">Courier New</xsl:variable>
  14. <xsl:variable name="FontSize">11</xsl:variable>
  15. <xsl:variable name="FontStyle">font-family: 'Segoe UI'; font-size: '11';</xsl:variable>
  16.  
  17. <!-- Vertical align style of table items. -->
  18. <xsl:variable name="VerticalAlignStyle">vertical-align: top;</xsl:variable>
  19.  
  20. <!-- The width for + and - sign column -->
  21. <xsl:variable name="SignColumnWidth">15</xsl:variable>
  22.  
  23. <!-- The element name column width -->
  24. <xsl:variable name="ElementNameColumnWidth">130</xsl:variable>
  25.  
  26. <!-- The attribute name column width -->
  27. <xsl:variable name="AttributeNameColumnWidth">105</xsl:variable>
  28.  
  29. <!-- _locID_text="WordsFormat" -->
  30. <xsl:variable name="WordsFormat">In Words</xsl:variable>
  31.  
  32. <!-- _locID_text="BytesFormat" -->
  33. <xsl:variable name="BytesFormat">In Bytes</xsl:variable>
  34.  
  35. <xsl:template match="/*">   <!-- Match /Event, regardless of namespace -->
  36.  
  37. <html>
  38. <head>
  39.   <meta http-equiv="Content-Script-Type" content="text/javascript"/>
  40.   <script>
  41.   <![CDATA[
  42.     function Toggle(node)
  43.     {
  44.       if (!window.fullyLoaded) return;
  45.  
  46.       // Expand the branch?
  47.       if (node.nextSibling.style.display == 'none')
  48.       {
  49.         // Change the sign from "+" to "-".
  50.         var tBodyNode = node.childNodes[0];
  51.         var trNode = tBodyNode.childNodes[0];
  52.         var tdNode = trNode.childNodes[0];
  53.         var bNode = tdNode.childNodes[0];
  54.         var textNode = bNode.childNodes[0];
  55.         if (textNode.nodeType == 3 /* Node.TEXT_NODE */) {
  56.           var s = textNode.data;
  57.           if (s.length > 0 && s.charAt(0) == '+') {
  58.             textNode.data = '-' + s.substring(1, s.length);
  59.           }
  60.         }
  61.  
  62.         // show the branch
  63.         node.nextSibling.style.display = '';
  64.       }
  65.       else // Collapse the branch
  66.       {
  67.         // Change the sign from "-" to "+".
  68.         var tBodyNode = node.childNodes[0];
  69.         var trNode = tBodyNode.childNodes[0];
  70.         var tdNode = trNode.childNodes[0];
  71.         var bNode = tdNode.childNodes[0];
  72.         var textNode = bNode.childNodes[0];
  73.         if (textNode.nodeType == 3 /* Node.TEXT_NODE */) {
  74.           var s = textNode.data;
  75.           if (s.length > 0 && s.charAt(0) == '-') {
  76.             textNode.data = '+' + s.substring(1, s.length);
  77.           }
  78.         }
  79.  
  80.         // hide the branch
  81.         node.nextSibling.style.display = 'none';
  82.       }
  83.     }
  84.  
  85.     // Toggle "System" element by default so that it's default status is to hide its children
  86.     function ToggleSystemElement()
  87.     {
  88.       var body = document.getElementById("body");
  89.       var anchor = body.getElementsByTagName("table")[0];
  90.       Toggle(anchor);
  91.     }
  92.  
  93.     // If binary data is present in event XML, show it in friendly form.
  94.     function ProcessBinaryData(binaryString, binaryDataCaption, wordsFormatString, bytesFormatString, normalFont, fixedWidthFont)
  95.     {
  96.       var bodyNode = document.getElementById("body");
  97.  
  98.       // Add a <hr> at the end of the HTML body.
  99.       bodyNode.appendChild(document.createElement("hr"));      
  100.  
  101.       // This paragraph (p element) is the "Binary data:" literal string.
  102.       var p = document.createElement("p");
  103.       p.style.fontFamily = normalFont;
  104.       var b = document.createElement("b");
  105.       b.appendChild(document.createTextNode(binaryDataCaption));
  106.       p.appendChild(b);
  107.       p.appendChild(document.createElement("br"));
  108.       bodyNode.appendChild(p);
  109.  
  110.       //
  111.       // Show binary data in Words format.
  112.       //
  113.       p = document.createElement("p");
  114.       p.style.fontFamily = normalFont;
  115.       p.appendChild(document.createTextNode(wordsFormatString));
  116.       bodyNode.appendChild(p);
  117.  
  118.       // Must use fixed-width font for binary data.
  119.       p = document.createElement("p");
  120.       p.style.fontFamily = fixedWidthFont;
  121.     
  122.       var i = 0;
  123.       var j = 0;
  124.       var s, tempS;
  125.       var translatedString;
  126.       var charCode;
  127.       var byte1, byte2;
  128.  
  129.       // Each character in binaryString is a hex (16-based) representation of
  130.       // 4 binary bits. So it takes 2 characters in binaryString to form a
  131.       // complete byte; 4 characters for a word.
  132.       while (i < binaryString.length) {
  133.  
  134.         s = (i / 4).toString(16);    // To hex representation.
  135.         while (s.length < 4) {
  136.           s = "0" + s;
  137.         }
  138.         s += ": ";
  139.  
  140.         // DWords representation is simply a rearrangement of the original binaryString
  141.         // For example, from:
  142.         // 
  143.         // 0000000002005600000000000f000540
  144.         //
  145.         // (which is 00 00 00 00 02 00 56 00 00 00 00 00 0f 00 05 40).
  146.         //
  147.         // to:
  148.         //
  149.         // 0000: 00000000 00560002 00000000 4005000f
  150.         // 8 words per line, 4 DWords per line.
  151.         for (j = 0; j < 4; j++) {
  152.           s += binaryString.substring(i + 6, i + 8);
  153.           s += binaryString.substring(i + 4, i + 6);
  154.           s += binaryString.substring(i + 2, i + 4);
  155.           s += binaryString.substring(i, i + 2) + " ";
  156.           i += 8;
  157.         }
  158.  
  159.         p.appendChild(document.createTextNode(s));
  160.         p.appendChild(document.createElement("br"));
  161.       }
  162.  
  163.       bodyNode.appendChild(p);
  164.  
  165.       //
  166.       // Show binary data in bytes format.
  167.       //
  168.       p = document.createElement("p");
  169.       p.style.fontFamily = normalFont;
  170.       p.appendChild(document.createTextNode(bytesFormatString));
  171.       bodyNode.appendChild(p);
  172.  
  173.       // Must use fixed-width font for binary data.
  174.       p = document.createElement("p");
  175.       p.style.fontFamily = fixedWidthFont;
  176.     
  177.       i = 0;
  178.       j = 0;
  179.  
  180.       // Each character in binaryString is a hex (16-based) representation of
  181.       // 4 binary bits. So it takes 2 characters in binaryString to form a
  182.       // complete byte.
  183.       while (i < binaryString.length) {
  184.         translatedString = "";
  185.         // 2 characters in binaryString to form a byte
  186.         s = (i / 2).toString(16);   // to hex representation.
  187.  
  188.         // Prefix with '0' until its length is 4.
  189.         while (s.length < 4) {
  190.           s = "0" + s;
  191.         }
  192.         s += ": ";
  193.  
  194.         // Show 8 bytes per line
  195.         for (j = 0; j < 8; j++) {
  196.           tempS = binaryString.substring(i, i + 2); // 2 for 1 byte
  197.           i += 2;
  198.           s += tempS + " ";
  199.  
  200.           // Treat tempS as hex integer
  201.           charCode = parseInt(tempS, 16);
  202.           if (charCode < 32) {
  203.             translatedString += ".";
  204.           } else {
  205.             translatedString += String.fromCharCode(charCode);
  206.           }
  207.         }
  208.  
  209.         while (s.length < 32) {
  210.           s += " ";
  211.         }
  212.         s += translatedString;
  213.         
  214.         p.appendChild(document.createTextNode(s));
  215.         p.appendChild(document.createElement("br"));
  216.       }
  217.  
  218.       bodyNode.appendChild(p);
  219.     }
  220.   ]]>
  221.   </script>
  222. </head>
  223.  
  224. <!-- Test whether there is binary data -->
  225. <xsl:choose>
  226. <xsl:when test="descendant::*[contains(local-name(), 'Binary')]">
  227.   <!-- _locID_text="BinaryDataCaption" _locComment="Caption for Binary Data" -->
  228.   <xsl:variable name="BinaryDataCaption">Binary data:</xsl:variable>
  229.   <xsl:variable name="BinaryData"><xsl:value-of select="descendant::*[contains(local-name(), 'Binary')]"/></xsl:variable>
  230.   <body id="body" onload="window.fullyLoaded='true'; ToggleSystemElement(); ProcessBinaryData('{$BinaryData}', '{$BinaryDataCaption}', '{$WordsFormat}', '{$BytesFormat}', '{$FontFamily}', '{$FontFamily_FixWidth}')">
  231.     <xsl:for-each select="node()">
  232.       <!-- Treat EventData specially -->
  233.       <xsl:choose>
  234.         <xsl:when test="name()='EventData'">
  235.           <xsl:call-template name="EventDataNode"/>
  236.         </xsl:when>
  237.         <xsl:otherwise>
  238.           <xsl:call-template name="node"/>
  239.         </xsl:otherwise>
  240.       </xsl:choose>
  241.     </xsl:for-each>
  242.   </body>
  243. </xsl:when>
  244. <xsl:otherwise>  <!-- No binary data -->
  245.   <body id="body" onload="window.fullyLoaded=true;ToggleSystemElement();">
  246.     <xsl:for-each select="node()">
  247.       <!-- Treat EventData specially -->
  248.       <xsl:choose>
  249.         <xsl:when test="name()='EventData'">
  250.           <xsl:call-template name="EventDataNode"/>
  251.         </xsl:when>
  252.         <xsl:otherwise>
  253.           <xsl:call-template name="node"/>
  254.         </xsl:otherwise>
  255.       </xsl:choose>
  256.     </xsl:for-each>
  257.   </body>
  258. </xsl:otherwise>
  259. </xsl:choose>
  260.  
  261. </html>
  262. </xsl:template>
  263.  
  264. <xsl:template name="node">
  265.  
  266. <!-- Is this a "pure" text node like the "inner text" inside "<node>inner text</node>"? -->
  267. <xsl:choose>
  268. <xsl:when test="count(node())=0 and string-length(.) and not(name())">
  269. <table border="0" cellspacing="0">
  270.   <tr>
  271.     <td width="{$SignColumnWidth}" nowrap="true"></td>
  272.     <td style="{$FontStyle} {$VerticalAlignStyle}">
  273.       <xsl:value-of select="."/>
  274.     </td>
  275.   </tr>
  276. </table>
  277. </xsl:when>
  278. <xsl:otherwise>
  279. <!-- Not a pure text node-->
  280.  
  281. <xsl:choose>
  282.   <!-- Does this node contains attributes? -->
  283.   <xsl:when test="count(./@*)">
  284.     <!-- Yes, contains attributes, we need to make it collapsable -->
  285.  
  286.     <xsl:choose>
  287.  
  288.       <!-- Does this node contains only text like "<node>inner text</node>"? -->
  289.       <xsl:when test="count(node())=1 and text()">
  290.         <!-- Yes, only inner text -->
  291.         <table onClick="Toggle(this)" style="cursor: hand;">
  292.           <tr>
  293.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true">
  294.               <b>-</b>
  295.             </td>
  296.             <xsl:text> </xsl:text>
  297.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  298.               <b>
  299.                 <xsl:value-of select="name()"/>
  300.               </b>
  301.             </td>
  302.             <td style="{$FontStyle} {$VerticalAlignStyle}">
  303.               <xsl:value-of select="text()"/>
  304.             </td>
  305.           </tr>
  306.         </table>
  307.         <div>
  308.           <!-- This div will be hided upon handling the above "onclick" event -->
  309.           <xsl:for-each select='./@*'>
  310.             <table border="0" cellspacing="0">
  311.               <tr>
  312.                 <td width="{$SignColumnWidth}" nowrap="true"></td>
  313.                 <td width="{$SignColumnWidth}" nowrap="true"></td>
  314.                 <!-- We do need 2 sign widths for nice formatting -->
  315.                 <td width="{$AttributeIndent}" nowrap="true"></td>
  316.                 <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$AttributeNameColumnWidth}" nowrap="true">
  317.                   [ <b>
  318.                     <xsl:value-of select="name()"/>
  319.                   </b>]
  320.                 </td>
  321.                 <td style="{$FontStyle} {$VerticalAlignStyle}">
  322.                   <xsl:value-of select="."/>
  323.                 </td>
  324.               </tr>
  325.             </table>
  326.           </xsl:for-each>
  327.         </div>
  328.       </xsl:when>
  329.       <xsl:otherwise>
  330.         <!-- Not "only inner text -->
  331.         <table onClick="Toggle(this)" style="cursor: hand;">
  332.           <tr>
  333.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true">
  334.               <b>-</b>
  335.             </td>
  336.             <xsl:text> </xsl:text>
  337.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  338.               <b>
  339.                 <xsl:value-of select="name()"/>
  340.               </b>
  341.             </td>
  342.           </tr>
  343.         </table>
  344.         <div>
  345.           <!-- Deal with attributes -->
  346.           <xsl:for-each select='./@*'>
  347.             <table border="0" cellspacing="0">
  348.               <tr>
  349.                 <td width="{$SignColumnWidth}" nowrap="true"></td>
  350.                 <td width="{$SignColumnWidth}" nowrap="true"></td>
  351.                 <!-- We do need 2 sign widths for nice formatting -->
  352.                 <td width="{$AttributeIndent}" nowrap="true"></td>
  353.                 <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$AttributeNameColumnWidth}" nowrap="true">
  354.                   [ <b>
  355.                     <xsl:value-of select="name()"/>
  356.                   </b>]
  357.                 </td>
  358.                 <td style="{$FontStyle} {$VerticalAlignStyle}">
  359.                   <xsl:value-of select="."/>
  360.                 </td>
  361.               </tr>
  362.             </table>
  363.           </xsl:for-each>
  364.  
  365.           <!-- Deal with sub-nodes -->
  366.           <xsl:for-each select="node()">
  367.             <table border="0" cellspacing="0">
  368.               <tr>
  369.                 <td width="{$SignColumnWidth}" nowrap="true"></td>
  370.                 <td width="{$indent}" nowrap="true"></td>
  371.                 <td style="{$FontStyle} {$VerticalAlignStyle}">
  372.                   <xsl:call-template name="node"/>
  373.                 </td>
  374.               </tr>
  375.             </table>
  376.           </xsl:for-each>
  377.         </div>
  378.       </xsl:otherwise>
  379.     </xsl:choose>
  380.  
  381.   </xsl:when>
  382.   <xsl:otherwise>
  383.     <!-- Contains no attributes. Whether to be collapsable depends on whether it has children. -->
  384.     <!-- Does this node contains only text like "<node>inner text</node>"? -->
  385.     <xsl:choose>
  386.       <xsl:when test="count(node())=1 and text()">
  387.         <!-- Only has inner text -->
  388.         <table>
  389.           <tr>
  390.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true"></td>
  391.             <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  392.               <b>
  393.                 <xsl:value-of select="name()"/>
  394.               </b>
  395.             </td>
  396.             <td style="{$FontStyle} {$VerticalAlignStyle}">
  397.               <xsl:value-of select="text()"/>
  398.             </td>
  399.           </tr>
  400.         </table>
  401.       </xsl:when>
  402.       <xsl:otherwise>
  403.         <!-- Not "only inner text" -->
  404.  
  405.         <!-- Does this node have children? -->
  406.         <xsl:choose>
  407.           <xsl:when test="count(node())">
  408.             <table onClick="Toggle(this)" style="cursor: hand;">
  409.               <tr>
  410.                 <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true">
  411.                   <b>-</b>
  412.                 </td>
  413.                 <xsl:text> </xsl:text>
  414.                 <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  415.                   <b>
  416.                     <xsl:value-of select="name()"/>
  417.                   </b>
  418.                 </td>
  419.               </tr>
  420.             </table>
  421.             <div>
  422.               <xsl:for-each select="node()">
  423.                 <table border="0" cellspacing="0">
  424.                   <tr>
  425.                     <td width="{$SignColumnWidth}" nowrap="true"></td>
  426.                     <td width="{$indent}" nowrap="true"></td>
  427.                     <td style="{$FontStyle} {$VerticalAlignStyle}">
  428.                       <xsl:call-template name="node"/>
  429.                     </td>
  430.                   </tr>
  431.                 </table>
  432.               </xsl:for-each>
  433.             </div>
  434.           </xsl:when>
  435.           <xsl:otherwise>
  436.             <!-- No children -->
  437.             <table>
  438.               <tr>
  439.                 <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true"></td>
  440.                 <td style="{$FontStyle}">
  441.                   <b>
  442.                     <xsl:value-of select="name()"/>
  443.                   </b>
  444.                 </td>
  445.               </tr>
  446.             </table>
  447.           </xsl:otherwise>
  448.         </xsl:choose>
  449.       </xsl:otherwise>
  450.     </xsl:choose>
  451.  
  452.   </xsl:otherwise>
  453. </xsl:choose>
  454.  
  455. </xsl:otherwise>
  456. </xsl:choose>
  457. </xsl:template>
  458.  
  459. <!-- Template for "EventData". This is used for "System\EventData" only. -->
  460. <xsl:template name="EventDataNode">
  461.   <!-- Does this node have children? -->
  462.   <xsl:choose>
  463.     <xsl:when test="count(node())">
  464.       <table onClick="Toggle(this)" style="cursor: hand;">
  465.         <tr>
  466.           <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true">
  467.             <b>-</b>
  468.           </td>
  469.           <!-- &#  is tab -->
  470.           <xsl:text> </xsl:text>
  471.           <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  472.             <b>
  473.               <xsl:value-of select="name()"/>
  474.             </b>
  475.           </td>
  476.         </tr>
  477.       </table>
  478.       <div>
  479.         <xsl:for-each select="node()">
  480.           <table border="0" cellspacing="0">
  481.             <tr>
  482.               <td width="{$SignColumnWidth}" nowrap="true"></td>
  483.               <td width="{$indent}" nowrap="true"></td>
  484.               <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$ElementNameColumnWidth}" nowrap="true">
  485.                 <b>
  486.                   <xsl:value-of select="./@Name"/>
  487.                 </b>
  488.               </td>
  489.               <td style="{$FontStyle} {$VerticalAlignStyle}">
  490.                 <xsl:value-of select="text()"/>
  491.               </td>
  492.             </tr>
  493.           </table>
  494.         </xsl:for-each>
  495.       </div>
  496.     </xsl:when>
  497.     <xsl:otherwise>
  498.       <!-- No children -->
  499.       <table>
  500.         <tr>
  501.           <td style="{$FontStyle} {$VerticalAlignStyle}" width="{$SignColumnWidth}" nowrap="true"></td>
  502.           <td style="{$FontStyle}">
  503.             <b>
  504.               <xsl:value-of select="name()"/>
  505.             </b>
  506.           </td>
  507.         </tr>
  508.       </table>
  509.     </xsl:otherwise>
  510.   </xsl:choose>
  511. </xsl:template>  
  512.  
  513. </xsl:stylesheet>
  514.