Insert XSL styles into output XML files
diff --git a/bench/spbench/spbench.xsl b/bench/spbench/spbench.xsl
deleted file mode 100644
index 7727542..0000000
--- a/bench/spbench/spbench.xsl
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
-    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
-
-<!-- Desire Nuentsa, Inria -->
-
-<xsl:output method="html" indent="no"/>
-
-<xsl:template match="/"> <!-- Root of the document -->
-  <html>
-    <head> 
-      <style type="text/css"> 
-        td { white-space: nowrap;}
-      </style>
-    </head>
-    <body>
-    <table border="1" width="100%" height="100%">
-        <TR> <!-- Write the table header -->
-        <TH>Matrix</TH> <TH>N</TH> <TH> NNZ</TH>  <TH> Sym</TH>  <TH> SPD</TH> <TH> </TH> 
-          <xsl:for-each select="BENCH/AVAILSOLVER/SOLVER">
-            <xsl:sort select="@ID" data-type="number"/>
-            <TH> 
-              <xsl:value-of select="TYPE" />
-              <xsl:text></xsl:text>
-              <xsl:value-of select="PACKAGE" />
-              <xsl:text></xsl:text>
-            </TH>
-          </xsl:for-each>
-        </TR>
-        
-        <xsl:for-each select="BENCH/LINEARSYSTEM">
-          <TR> <!-- print statistics for one linear system-->
-            <TH rowspan="4"> <xsl:value-of select="MATRIX/NAME" /> </TH>  
-            <TD rowspan="4"> <xsl:value-of select="MATRIX/SIZE" /> </TD>
-            <TD rowspan="4"> <xsl:value-of select="MATRIX/ENTRIES" /> </TD>
-            <TD rowspan="4"> <xsl:value-of select="MATRIX/SYMMETRY" /> </TD>
-            <TD rowspan="4"> <xsl:value-of select="MATRIX/POSDEF" /> </TD>
-            <TH> Compute Time </TH> 
-            <xsl:for-each select="SOLVER_STAT">
-              <xsl:sort select="@ID" data-type="number"/>
-              <TD> <xsl:value-of select="TIME/COMPUTE" /> </TD>
-            </xsl:for-each>
-          </TR>
-          <TR> 
-            <TH> Solve Time </TH> 
-            <xsl:for-each select="SOLVER_STAT">
-              <xsl:sort select="@ID" data-type="number"/>
-              <TD> <xsl:value-of select="TIME/SOLVE" /> </TD>
-            </xsl:for-each>
-          </TR>
-          <TR> 
-            <TH> Total Time </TH> 
-            <xsl:for-each select="SOLVER_STAT">
-              <xsl:sort select="@ID" data-type="number"/>
-              <xsl:choose>
-                <xsl:when test="@ID=../BEST_SOLVER/@ID">
-                  <TD style="background-color:red"> <xsl:value-of select="TIME/TOTAL" />  </TD>
-                </xsl:when>
-                <xsl:otherwise>
-                  <TD>  <xsl:value-of select="TIME/TOTAL" /></TD>
-                </xsl:otherwise>
-              </xsl:choose>
-            </xsl:for-each>
-          </TR>
-          <TR>
-            <TH> Error </TH> 
-            <xsl:for-each select="SOLVER_STAT">
-              <xsl:sort select="@ID" data-type="number"/>
-              <TD> <xsl:value-of select="ERROR" />
-              <xsl:if test="ITER">
-                <xsl:text>(</xsl:text> 
-                <xsl:value-of select="ITER" />
-                <xsl:text>)</xsl:text>
-              </xsl:if> </TD>
-            </xsl:for-each>
-          </TR>
-        </xsl:for-each>
-    </table>
-  </body>
-  </html>
-</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/bench/spbench/spbenchsolver.cpp b/bench/spbench/spbenchsolver.cpp
index ff0ce4c..4acd003 100644
--- a/bench/spbench/spbenchsolver.cpp
+++ b/bench/spbench/spbenchsolver.cpp
@@ -14,7 +14,7 @@
     cout<< " OPTIONS : \n"; 
     cout<< " -h or --help \n    print this help and return\n\n";
     cout<< " -d matrixdir \n    Use matrixdir as the matrix folder instead of the one specified in the environment variable EIGEN_MATRIXDIR\n\n"; 
-    cout<< " -o outputfile.html \n    Output the statistics to a html file \n\n";
+    cout<< " -o outputfile.xml \n    Output the statistics to a xml file \n\n";
     cout<< " --eps <RelErr> Sets the relative tolerance for iterative solvers (default 1e-08) \n\n";
     cout<< " --maxits <MaxIts> Sets the maximum number of iterations (default 1000) \n\n";
     
diff --git a/bench/spbench/spbenchsolver.h b/bench/spbench/spbenchsolver.h
index 99f05aa..c48ed7a 100644
--- a/bench/spbench/spbenchsolver.h
+++ b/bench/spbench/spbenchsolver.h
@@ -10,7 +10,7 @@
 
 #include <iostream>
 #include <fstream>
-#include "Eigen/SparseCore"
+#include <Eigen/SparseCore>
 #include <bench/BenchTimer.h>
 #include <cstdlib>
 #include <string>
@@ -22,6 +22,8 @@
 #include <Eigen/LU>
 #include <unsupported/Eigen/SparseExtra>
 
+#include "spbenchstyle.h"
+
 #ifdef EIGEN_CHOLMOD_SUPPORT
 #include <Eigen/CholmodSupport>
 #endif
@@ -85,103 +87,103 @@
   // Print XML header
   // NOTE It would have been much easier to write these XML documents using external libraries like tinyXML or Xerces-C++.
   
-  out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n";
-  out << "<?xml-stylesheet type=\"text/xsl\" href=\"spbench.xsl\" ?> \n"; 
-  out << "<!DOCTYPE BENCH  SYSTEM \"spbench.dtd\"> \n"; 
-  out << "\n<!-- Generated by the Eigen library -->\n"; 
+  out << "<?xml version='1.0' encoding='UTF-8'?> \n";
+  out << "<?xml-stylesheet type='text/xsl' href='#stylesheet' ?> \n"; 
+  out << "<!DOCTYPE BENCH  [\n<!ATTLIST xsl:stylesheet\n id\t ID  #REQUIRED>\n]>";
+  out << "\n\n<!-- Generated by the Eigen library -->\n"; 
   
-  
-  // Write the root XML element 
-  out << "\n<BENCH> \n" ;
+  out << "\n<BENCH> \n" ; //root XML element 
+  // Print the xsl style section
+  printBenchStyle(out); 
   // List all available solvers 
   out << " <AVAILSOLVER> \n";
 #ifdef EIGEN_UMFPACK_SUPPORT
-  out <<"  <SOLVER ID=\"" << EIGEN_UMFPACK << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_UMFPACK << "'>\n"; 
   out << "   <TYPE> LU </TYPE> \n";
   out << "   <PACKAGE> UMFPACK </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
 #endif
 #ifdef EIGEN_SUPERLU_SUPPORT
-  out <<"  <SOLVER ID=\"" << EIGEN_SUPERLU << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_SUPERLU << "'>\n"; 
   out << "   <TYPE> LU </TYPE> \n";
   out << "   <PACKAGE> SUPERLU </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
 #endif
 #ifdef EIGEN_CHOLMOD_SUPPORT
-  out <<"  <SOLVER ID=\"" << EIGEN_CHOLMOD_SIMPLICIAL_LLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_SIMPLICIAL_LLT << "'>\n"; 
   out << "   <TYPE> LLT SP</TYPE> \n";
   out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_CHOLMOD_SUPERNODAL_LLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_SUPERNODAL_LLT << "'>\n"; 
   out << "   <TYPE> LLT</TYPE> \n";
   out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";
   out << "  </SOLVER> \n";
   
-  out <<"  <SOLVER ID=\"" << EIGEN_CHOLMOD_LDLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_LDLT << "'>\n"; 
   out << "   <TYPE> LDLT </TYPE> \n";
   out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";  
   out << "  </SOLVER> \n"; 
 #endif
 #ifdef EIGEN_PARDISO_SUPPORT
-  out <<"  <SOLVER ID=\"" << EIGEN_PARDISO << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PARDISO << "'>\n"; 
   out << "   <TYPE> LU </TYPE> \n";
   out << "   <PACKAGE> PARDISO </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_PARDISO_LLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PARDISO_LLT << "'>\n"; 
   out << "   <TYPE> LLT </TYPE> \n";
   out << "   <PACKAGE> PARDISO </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_PARDISO_LDLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PARDISO_LDLT << "'>\n"; 
   out << "   <TYPE> LDLT </TYPE> \n";
   out << "   <PACKAGE> PARDISO </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
 #endif
 #ifdef EIGEN_PASTIX_SUPPORT
-  out <<"  <SOLVER ID=\"" << EIGEN_PASTIX << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PASTIX << "'>\n"; 
   out << "   <TYPE> LU </TYPE> \n";
   out << "   <PACKAGE> PASTIX </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_PASTIX_LLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PASTIX_LLT << "'>\n"; 
   out << "   <TYPE> LLT </TYPE> \n";
   out << "   <PACKAGE> PASTIX </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_PASTIX_LDLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_PASTIX_LDLT << "'>\n"; 
   out << "   <TYPE> LDLT </TYPE> \n";
   out << "   <PACKAGE> PASTIX </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
 #endif
   
-  out <<"  <SOLVER ID=\"" << EIGEN_BICGSTAB << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_BICGSTAB << "'>\n"; 
   out << "   <TYPE> BICGSTAB </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_BICGSTAB_ILUT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_BICGSTAB_ILUT << "'>\n"; 
   out << "   <TYPE> BICGSTAB_ILUT </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_GMRES_ILUT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_GMRES_ILUT << "'>\n"; 
   out << "   <TYPE> GMRES_ILUT </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_SIMPLICIAL_LDLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_SIMPLICIAL_LDLT << "'>\n"; 
   out << "   <TYPE> LDLT </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_SIMPLICIAL_LLT << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_SIMPLICIAL_LLT << "'>\n"; 
   out << "   <TYPE> LLT </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
   
-  out <<"  <SOLVER ID=\"" << EIGEN_CG << "\">\n"; 
+  out <<"  <SOLVER ID='" << EIGEN_CG << "'>\n"; 
   out << "   <TYPE> CG </TYPE> \n";
   out << "   <PACKAGE> EIGEN </PACKAGE> \n"; 
   out << "  </SOLVER> \n"; 
@@ -260,7 +262,7 @@
 void call_directsolver(Solver& solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)
 {
     std::ofstream statbuf(statFile.c_str(), std::ios::app);
-    statbuf << "   <SOLVER_STAT ID=\"" << solver_id <<"\">\n"; 
+    statbuf << "   <SOLVER_STAT ID='" << solver_id <<"'>\n"; 
     call_solver(solver, solver_id, A, b, refX,statbuf);
     statbuf << "   </SOLVER_STAT>\n";
     statbuf.close();
@@ -273,7 +275,7 @@
   solver.setMaxIterations(MaximumIters);
   
   std::ofstream statbuf(statFile.c_str(), std::ios::app);
-  statbuf << " <SOLVER_STAT ID=\"" << solver_id <<"\">\n"; 
+  statbuf << " <SOLVER_STAT ID='" << solver_id <<"'>\n"; 
   call_solver(solver, solver_id, A, b, refX,statbuf); 
   statbuf << "   <ITER> "<< solver.iterations() << "</ITER>\n";
   statbuf << " </SOLVER_STAT>\n";
@@ -303,7 +305,6 @@
     cout << "\nSolving with SUPERLU ... \n"; 
     SuperLU<SpMat> solver;
     call_directsolver(solver, EIGEN_SUPERLU, A, b, refX,statFile); 
-    printStatItem(stat, best_time_id, best_time_val); 
   }
   #endif
     
@@ -448,7 +449,6 @@
 //       cout << "\nSolving with CG and IdentityPreconditioner ... \n"; 
 //       ConjugateGradient<SpMat, Lower, IdentityPreconditioner> solver; 
 //       call_itersolver(solver,EIGEN_CG_PRECOND, A, b, refX,statFile);
-//       printStatItem(stat, best_time_id, best_time_val); 
 //     }
   } // End SPD matrices 
 }
@@ -504,8 +504,8 @@
     if(statFileExists)
     {
       std::ofstream statbuf(statFile.c_str(), std::ios::app);
-      statbuf << "  <BEST_SOLVER ID=\""<< best_time_id
-              << "\"></BEST_SOLVER>\n"; 
+      statbuf << "  <BEST_SOLVER ID='"<< best_time_id
+              << "'></BEST_SOLVER>\n"; 
       statbuf << " </LINEARSYSTEM> \n"; 
       statbuf.close();
     }
diff --git a/bench/spbench/spbenchstyle.h b/bench/spbench/spbenchstyle.h
new file mode 100644
index 0000000..17a05ce
--- /dev/null
+++ b/bench/spbench/spbenchstyle.h
@@ -0,0 +1,94 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef SPBENCHSTYLE_H
+#define SPBENCHSTYLE_H
+
+void printBenchStyle(std::ofstream& out)
+{
+  out << "<xsl:stylesheet id='stylesheet' version='1.0' \
+      xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >\n \
+      <xsl:template match='xsl:stylesheet' />\n \
+      <xsl:template match='/'> <!-- Root of the document -->\n \
+      <html>\n \
+        <head> \n \
+          <style type='text/css'> \n \
+            td { white-space: nowrap;}\n \
+          </style>\n \
+        </head>\n \
+        <body>";
+  out<<"<table border='1' width='100%' height='100%'>\n \
+        <TR> <!-- Write the table header -->\n \
+        <TH>Matrix</TH> <TH>N</TH> <TH> NNZ</TH>  <TH> Sym</TH>  <TH> SPD</TH> <TH> </TH>\n \
+          <xsl:for-each select='BENCH/AVAILSOLVER/SOLVER'>\n \
+            <xsl:sort select='@ID' data-type='number'/>\n \
+            <TH>\n \
+              <xsl:value-of select='TYPE' />\n \
+              <xsl:text></xsl:text>\n \
+              <xsl:value-of select='PACKAGE' />\n \
+              <xsl:text></xsl:text>\n \
+            </TH>\n \
+          </xsl:for-each>\n \
+        </TR>";
+        
+  out<<"  <xsl:for-each select='BENCH/LINEARSYSTEM'>\n \
+          <TR> <!-- print statistics for one linear system-->\n \
+            <TH rowspan='4'> <xsl:value-of select='MATRIX/NAME' /> </TH>\n \
+            <TD rowspan='4'> <xsl:value-of select='MATRIX/SIZE' /> </TD>\n \
+            <TD rowspan='4'> <xsl:value-of select='MATRIX/ENTRIES' /> </TD>\n \
+            <TD rowspan='4'> <xsl:value-of select='MATRIX/SYMMETRY' /> </TD>\n \
+            <TD rowspan='4'> <xsl:value-of select='MATRIX/POSDEF' /> </TD>\n \
+            <TH> Compute Time </TH>\n \
+            <xsl:for-each select='SOLVER_STAT'>\n \
+              <xsl:sort select='@ID' data-type='number'/>\n \
+              <TD> <xsl:value-of select='TIME/COMPUTE' /> </TD>\n \
+            </xsl:for-each>\n \
+          </TR>";
+  out<<"  <TR>\n \
+            <TH> Solve Time </TH>\n \
+            <xsl:for-each select='SOLVER_STAT'>\n \
+              <xsl:sort select='@ID' data-type='number'/>\n \
+              <TD> <xsl:value-of select='TIME/SOLVE' /> </TD>\n \
+            </xsl:for-each>\n \
+          </TR>\n \
+          <TR>\n \
+            <TH> Total Time </TH>\n \
+            <xsl:for-each select='SOLVER_STAT'>\n \
+              <xsl:sort select='@ID' data-type='number'/>\n \
+              <xsl:choose>\n \
+                <xsl:when test='@ID=../BEST_SOLVER/@ID'>\n \
+                  <TD style='background-color:red'> <xsl:value-of select='TIME/TOTAL' />  </TD>\n \
+                </xsl:when>\n \
+                <xsl:otherwise>\n \
+                  <TD>  <xsl:value-of select='TIME/TOTAL' /></TD>\n \
+                </xsl:otherwise>\n \
+              </xsl:choose>\n \
+            </xsl:for-each>\n \
+          </TR>";
+  out<<"  <TR>\n \
+              <TH> Error </TH>\n \
+              <xsl:for-each select='SOLVER_STAT'>\n \
+                <xsl:sort select='@ID' data-type='number'/>\n \
+                <TD> <xsl:value-of select='ERROR' />\n \
+                <xsl:if test='ITER'>\n \
+                  <xsl:text>(</xsl:text>\n \
+                  <xsl:value-of select='ITER' />\n \
+                  <xsl:text>)</xsl:text>\n \
+                </xsl:if> </TD>\n \
+              </xsl:for-each>\n \
+            </TR>\n \
+          </xsl:for-each>\n \
+      </table>\n \
+    </body>\n \
+    </html>\n \
+  </xsl:template>\n \
+  </xsl:stylesheet>\n\n";
+  
+}
+#endif
\ No newline at end of file