You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by se...@apache.org on 2014/05/17 02:58:53 UTC

svn commit: r1595400 - in /jmeter/trunk/xdocs: demos/JDBC-Pre-Post-Processor.jmx extending/notes_on_extending.txt stylesheets/site.xsl

Author: sebb
Date: Sat May 17 00:58:53 2014
New Revision: 1595400

URL: http://svn.apache.org/r1595400
Log:
Tab police

Modified:
    jmeter/trunk/xdocs/demos/JDBC-Pre-Post-Processor.jmx
    jmeter/trunk/xdocs/extending/notes_on_extending.txt
    jmeter/trunk/xdocs/stylesheets/site.xsl

Modified: jmeter/trunk/xdocs/demos/JDBC-Pre-Post-Processor.jmx
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/demos/JDBC-Pre-Post-Processor.jmx?rev=1595400&r1=1595399&r2=1595400&view=diff
==============================================================================
--- jmeter/trunk/xdocs/demos/JDBC-Pre-Post-Processor.jmx (original)
+++ jmeter/trunk/xdocs/demos/JDBC-Pre-Post-Processor.jmx Sat May 17 00:58:53 2014
@@ -259,21 +259,21 @@
               <stringProp name="script">import groovy.sql.Sql
 import org.apache.jmeter.protocol.jdbc.config.DataSourceElement
 try {
-	// build Pfo List
-	println(&quot;Building Portfolio List&quot;)
-	def pfoList = &quot;&lt;PfoList&gt;&quot;
-	def pfoNr = 1
-	def pfo = vars.get(&quot;Pfo_&quot; + pfoNr)
-	while(pfo != null) {
-		println(&quot;Pfo: $pfo&quot;);
-		pfoList = pfoList + &quot;&lt;Pfo ID=&apos;$pfo&apos; EmptyValuation=&apos;true&apos; PropagatePrice=&apos;true&apos;/&gt;&quot;
-		pfoNr++
-		pfo = vars.get(&quot;Pfo_&quot; + pfoNr)
-	}
-	pfoList = pfoList + &quot;&lt;/PfoList&gt;&quot;
-	vars.put(&quot;PfoListXML&quot;, pfoList)
+    // build Pfo List
+    println(&quot;Building Portfolio List&quot;)
+    def pfoList = &quot;&lt;PfoList&gt;&quot;
+    def pfoNr = 1
+    def pfo = vars.get(&quot;Pfo_&quot; + pfoNr)
+    while(pfo != null) {
+        println(&quot;Pfo: $pfo&quot;);
+        pfoList = pfoList + &quot;&lt;Pfo ID=&apos;$pfo&apos; EmptyValuation=&apos;true&apos; PropagatePrice=&apos;true&apos;/&gt;&quot;
+        pfoNr++
+        pfo = vars.get(&quot;Pfo_&quot; + pfoNr)
+    }
+    pfoList = pfoList + &quot;&lt;/PfoList&gt;&quot;
+    vars.put(&quot;PfoListXML&quot;, pfoList)
 } catch (Exception e) {
-  	println(e.toString());
+    println(e.toString());
 }</stringProp>
             </BSFPreProcessor>
             <hashTree/>

Modified: jmeter/trunk/xdocs/extending/notes_on_extending.txt
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/extending/notes_on_extending.txt?rev=1595400&r1=1595399&r2=1595400&view=diff
==============================================================================
--- jmeter/trunk/xdocs/extending/notes_on_extending.txt (original)
+++ jmeter/trunk/xdocs/extending/notes_on_extending.txt Sat May 17 00:58:53 2014
@@ -4,9 +4,9 @@
 #   The ASF licenses this file to You under the Apache License, Version 2.0
 #   (the "License"); you may not use this file except in compliance with
 #   the License.  You may obtain a copy of the License at
-# 
+#
 #       http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 #   Unless required by applicable law or agreed to in writing, software
 #   distributed under the License is distributed on an "AS IS" BASIS,
 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,108 +15,108 @@
 
  Making a TestBean Plugin For JMeter
 
-This component will be a CSV file reading element that will let users easily vary their input 
+This component will be a CSV file reading element that will let users easily vary their input
 data using csv files.
 
 1. Pick a package and make three files:
-	- [ComponentName].java (org.apache.jmeter.config.CSVDataSet.java)
-	- [ComponentName]BeanInfo.java (org.apache.jmeter.config.CSVDataSetBeanInfo.java)
-	- [ComponentName]Resources.properties (org.apache.jmeter.config.CSVDataSetResources.properties)
-	
-2. CSVDataSet.java must implement the TestBean interface.  In addition, it will extend 
+    - [ComponentName].java (org.apache.jmeter.config.CSVDataSet.java)
+    - [ComponentName]BeanInfo.java (org.apache.jmeter.config.CSVDataSetBeanInfo.java)
+    - [ComponentName]Resources.properties (org.apache.jmeter.config.CSVDataSetResources.properties)
+
+2. CSVDataSet.java must implement the TestBean interface.  In addition, it will extend
 ConfigTestElement, and implement LoopIterationListener.
-	- TestBean is a marker interface, so there are no methods to implement.
-	- Extending ConfigTestElement will make our component a Config element in a test plan.  By
-	   extending different abstract classes, you can control the type of element your component will
-	   be (ie AbstractSampler, AbstractVisualizer, GenericController, etc - though you can also make 
-	   different types of elements just by instantiating the right interfaces, the abstract classes can
-	   make your life easier).
+    - TestBean is a marker interface, so there are no methods to implement.
+    - Extending ConfigTestElement will make our component a Config element in a test plan.  By
+       extending different abstract classes, you can control the type of element your component will
+       be (ie AbstractSampler, AbstractVisualizer, GenericController, etc - though you can also make
+       different types of elements just by instantiating the right interfaces, the abstract classes can
+       make your life easier).
 
 3. CSVDataSetBeanInfo.java should extend org.apache.jmeter.testbeans.BeanInfoSupport
-	- create a zero-parameter constructor in which we call super(CSVDataSet.class);
-	- we'll come back to this.
+    - create a zero-parameter constructor in which we call super(CSVDataSet.class);
+    - we'll come back to this.
 
 4. CSVDataSetResources.properties - blank for now
 
-5. Implement your special logic for you plugin class.  
-	- The CSVDataSet will read a single CSV file and will store the values it finds into
-	JMeter's running context.  The user will define the file, define the variable names for
-	each "column".  The CSVDataSet will open the file when the test starts, and close it
-	when the test ends (thus we implement TestListener).  The CSVDataSet will update the
-	contents of the variables for every test thread, and for each iteration through its
-	parent controller, by reading new lines in the file.  When we reach the end of the file,
-	we'll start again at the beginning.
-	
-	- When implementing a TestBean, pay careful attention to your properties.  These
-	properties will become the basis of a gui form by which users will configure the CSVDataSet
-	element.
-	
-	- Your element will be cloned by JMeter when the test starts.  Each thread will get it's own instance.  However, you will
-	have a chance to control how the cloning is done - we'll be taking advantage of this for CSVDataSet (since we don't want to open the file X number of times from X number of threads).
-	
-	a. Properties: filename, variableNames.  With public getters and setters.
-		- filename is self-explanatory, it will hold the name of the CSV file we'll read
-		- variableNames is a String which will allow a user to enter the names of 
-		the variables we'll assign values to.  Why a String?  Why not a Collection - surely
-		users will need to enter multiple (and unknown number) variable names?  True, but
-		if we used a List or Collection, we'd have to write a gui component to handle 
-		collections, and I just want to do this quickly.  Instead, we'll let users input
-		comma-delimited list of variable names.
-		
-	b. I then implemented the IterationStart method of the LoopIterationListener interface.  The point
-	   of this "event" is that your component is notified of when the test has entered it's parent
-	   controller.  For our purposes, every time the CSVDataSet's parent controller is entered, we will
-	   read a new line of the data file and set the variables.  Thus, for a regular controller, each 
-	   loop through the test will result in a new set of values being read. For a loop controller, each
-	   iteration will do likewise.  Every test thread will get different values as well.
-	   
+5. Implement your special logic for you plugin class.
+    - The CSVDataSet will read a single CSV file and will store the values it finds into
+    JMeter's running context.  The user will define the file, define the variable names for
+    each "column".  The CSVDataSet will open the file when the test starts, and close it
+    when the test ends (thus we implement TestListener).  The CSVDataSet will update the
+    contents of the variables for every test thread, and for each iteration through its
+    parent controller, by reading new lines in the file.  When we reach the end of the file,
+    we'll start again at the beginning.
+
+    - When implementing a TestBean, pay careful attention to your properties.  These
+    properties will become the basis of a gui form by which users will configure the CSVDataSet
+    element.
+
+    - Your element will be cloned by JMeter when the test starts.  Each thread will get it's own instance.  However, you will
+    have a chance to control how the cloning is done - we'll be taking advantage of this for CSVDataSet (since we don't want to open the file X number of times from X number of threads).
+
+    a. Properties: filename, variableNames.  With public getters and setters.
+        - filename is self-explanatory, it will hold the name of the CSV file we'll read
+        - variableNames is a String which will allow a user to enter the names of
+        the variables we'll assign values to.  Why a String?  Why not a Collection - surely
+        users will need to enter multiple (and unknown number) variable names?  True, but
+        if we used a List or Collection, we'd have to write a gui component to handle
+        collections, and I just want to do this quickly.  Instead, we'll let users input
+        comma-delimited list of variable names.
+
+    b. I then implemented the IterationStart method of the LoopIterationListener interface.  The point
+       of this "event" is that your component is notified of when the test has entered it's parent
+       controller.  For our purposes, every time the CSVDataSet's parent controller is entered, we will
+       read a new line of the data file and set the variables.  Thus, for a regular controller, each
+       loop through the test will result in a new set of values being read. For a loop controller, each
+       iteration will do likewise.  Every test thread will get different values as well.
+
 6. Setting up your gui elements in CSVDataSetBeanInfo:
-	- You can create groupings for your component's properties.  Each grouping you create needs
-	   a label and a list of property names to include in that grouping.  Ie:
-	   
-	        createPropertyGroup("csv_data",new String[]{"filename","variableNames"});
-	        
-	   Creates a grouping called "csv_data" that will include gui input elements for the
-	   "filename" and "variableNames" properties of CSVDataSet.  Then, we need to define what kind of 
-	   properties we want these to be:
-	   
-	   		p = property("filename");
-        	p.setValue(NOT_UNDEFINED, Boolean.TRUE);
-        	p.setValue(DEFAULT, "");
-        	p.setValue(NOT_EXPRESSION,Boolean.TRUE);
-        	p = property("variableNames");
-        	p.setValue(NOT_UNDEFINED, Boolean.TRUE);
-        	p.setValue(DEFAULT, "");
-        	p.setValue(NOT_EXPRESSION,Boolean.TRUE);
-        	
-       This essentially creates two properties whose value is not allowed to be null, and whose default 
-       values are "".  There are several such attributes that can be set for each property.  Here is a 
+    - You can create groupings for your component's properties.  Each grouping you create needs
+       a label and a list of property names to include in that grouping.  Ie:
+
+            createPropertyGroup("csv_data",new String[]{"filename","variableNames"});
+
+       Creates a grouping called "csv_data" that will include gui input elements for the
+       "filename" and "variableNames" properties of CSVDataSet.  Then, we need to define what kind of
+       properties we want these to be:
+
+               p = property("filename");
+            p.setValue(NOT_UNDEFINED, Boolean.TRUE);
+            p.setValue(DEFAULT, "");
+            p.setValue(NOT_EXPRESSION,Boolean.TRUE);
+            p = property("variableNames");
+            p.setValue(NOT_UNDEFINED, Boolean.TRUE);
+            p.setValue(DEFAULT, "");
+            p.setValue(NOT_EXPRESSION,Boolean.TRUE);
+
+       This essentially creates two properties whose value is not allowed to be null, and whose default
+       values are "".  There are several such attributes that can be set for each property.  Here is a
        rundown:
-       
-       		NOT_UNDEFINED  : The property will not be left null.
-       		DEFAULT        : A default values must be given if NOT_UNDEFINED is true.
-       		NOT_EXPRESSION : The value will not be parsed for functions if this is true.
-       		NOT_OTHER      : This is not a free form entry field - a list of values has to be provided.
-       		TAGS           : with a String[] as the value, this sets up a predefined list of acceptable values, and JMeter will create a dropdown select.
-       		
+
+               NOT_UNDEFINED  : The property will not be left null.
+               DEFAULT        : A default values must be given if NOT_UNDEFINED is true.
+               NOT_EXPRESSION : The value will not be parsed for functions if this is true.
+               NOT_OTHER      : This is not a free form entry field - a list of values has to be provided.
+               TAGS           : with a String[] as the value, this sets up a predefined list of acceptable values, and JMeter will create a dropdown select.
+
        Additionally, a custom property editor can be specified for a property:
-       	
-       		p.setPropertyEditorClass(FileEditor.class);
-       
+
+               p.setPropertyEditorClass(FileEditor.class);
+
        This will create a text input plus browse button that opens a dialog for finding a file.
-       
+
        Usually, complex property settings are not needed, as now.  For a more complex example, look
        at org.apache.jmeter.protocol.http.sampler.AccessLogSamplerBeanInfo
-       
+
 7. Defining your resource strings.  In CSVDataSetResources.properties we have to define all our string
    resources.  To provide translations, one would create additional files such as CSVDataSetResources_ja.properties, and
    CSVDataSetResources_de.properties.  For our component, we must define the following resources:
-   
-   		displayName - This will provide a name for the element that will appear in menus.
-   		csv_data.displayName - we create a property grouping called "csv_data", so we have to provide a label for the grouping
-   		filename.displayName - a label for the filename input element.
-   		filename.shortDescription - a tool-tip-like help text blurb.
-   		variableNames.displayName - a label for the variable name input element.
-   		variableNames.shortDescription - tool tip for the variableNames input element.
-   		
+
+           displayName - This will provide a name for the element that will appear in menus.
+           csv_data.displayName - we create a property grouping called "csv_data", so we have to provide a label for the grouping
+           filename.displayName - a label for the filename input element.
+           filename.shortDescription - a tool-tip-like help text blurb.
+           variableNames.displayName - a label for the variable name input element.
+           variableNames.shortDescription - tool tip for the variableNames input element.
+
 8. Debug your component.
\ No newline at end of file

Modified: jmeter/trunk/xdocs/stylesheets/site.xsl
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/stylesheets/site.xsl?rev=1595400&r1=1595399&r2=1595400&view=diff
==============================================================================
--- jmeter/trunk/xdocs/stylesheets/site.xsl (original)
+++ jmeter/trunk/xdocs/stylesheets/site.xsl Sat May 17 00:58:53 2014
@@ -18,7 +18,7 @@
 
 <!-- Content Stylesheet for "jakarta-site2" Documentation -->
 <!-- NOTE:  Changes here should also be reflected in "site.vsl" and vice
-	  versa, so either Anakia or XSLT can be used for document generation.   -->
+      versa, so either Anakia or XSLT can be used for document generation.   -->
 
 
 <!-- Outstanding Compatibility Issues (with Anakia-based stylesheets):
@@ -48,8 +48,8 @@
 
   <!-- Output method -->
   <xsl:output method="html"
-				encoding="iso-8859-1"
-				  indent="no"/>
+                encoding="iso-8859-1"
+                  indent="no"/>
 
 
   <!-- Defined parameters (overrideable) -->
@@ -70,203 +70,203 @@
 
   <!-- Process an entire document into an HTML page -->
   <xsl:template match="document">
-	 <xsl:variable name="project"
-					 select="document('project.xml')/project"/>
+     <xsl:variable name="project"
+                     select="document('project.xml')/project"/>
 
-	 <html>
-	 <head>
-	 <title><xsl:value-of select="$project/title"/> - <xsl:value-of select="properties/title"/></title>
-	 <xsl:for-each select="properties/author">
-		<xsl:variable name="name">
-		  <xsl:value-of select="."/>
-		</xsl:variable>
-		<xsl:variable name="email">
-		  <xsl:value-of select="@email"/>
-		</xsl:variable>
-		<meta name="author" value="{$name}"/>
-		<meta name="email" value="{$email}"/>
-	 </xsl:for-each>
-	 </head>
-
-	 <body bgcolor="{$body-bg}" text="{$body-fg}" link="{$body-link}"
-			 alink="{$body-link}" vlink="{$body-link}">
-
-	 <table border="0" width="100%" cellspacing="4">
-
-		<xsl:comment>PAGE HEADER</xsl:comment>
-		<tr><td colspan="2">
-
-		  <xsl:comment>JAKARTA LOGO</xsl:comment>
-		  <a href="http://jakarta.apache.org/">
-			 <img src="http://jakarta.apache.org/images/jakarta-logo.gif"
-				 align="left" alt="The Jakarta Project" border="0"/>
-		  </a>
-		  <xsl:if test="$project/logo">
-			 <xsl:variable name="alt">
-				<xsl:value-of select="$project/logo"/>
-			 </xsl:variable>
-			 <xsl:variable name="home">
-				<xsl:value-of select="$project/@href"/>
-			 </xsl:variable>
-			 <xsl:variable name="src">
-				<xsl:value-of select="$project/logo/@href"/>
-			 </xsl:variable>
-
-			 <xsl:comment>PROJECT LOGO</xsl:comment>
-			 <a href="{$home}">
-				<img src="{$src}" align="right" alt="{$alt}" border="0"/>
-			 </a>
-		  </xsl:if>
-
-		</td></tr>
-
-		<xsl:comment>HEADER SEPARATOR</xsl:comment>
-		<tr>
-		  <td colspan="2">
-			 <hr noshade="" size="1"/>
-		  </td>
-		</tr>
-
-		<tr>
-
-		  <xsl:comment>LEFT SIDE NAVIGATION</xsl:comment>
-		  <td width="20%" valign="top" nowrap="true">
-			 <xsl:apply-templates select="$project/body/menu"/>
-		  </td>
-
-		  <xsl:comment>RIGHT SIDE MAIN BODY</xsl:comment>
-		  <td width="80%" valign="top" align="left">
-			 <xsl:apply-templates select="body/section"/>
-		  </td>
-
-		</tr>
-
-		<xsl:comment>FOOTER SEPARATOR</xsl:comment>
-		<tr>
-		  <td colspan="2">
-			 <hr noshade="" size="1"/>
-		  </td>
-		</tr>
-
-		<xsl:comment>PAGE FOOTER</xsl:comment>
-		<tr><td colspan="2">
-		  <div align="center"><font color="{$body-link}" size="-1"><em>
-		  Copyright &#169; 1999-2001, Apache Software Foundation
-		  </em></font></div>
-		</td></tr>
-
-	 </table>
-	 </body>
-	 </html>
+     <html>
+     <head>
+     <title><xsl:value-of select="$project/title"/> - <xsl:value-of select="properties/title"/></title>
+     <xsl:for-each select="properties/author">
+        <xsl:variable name="name">
+          <xsl:value-of select="."/>
+        </xsl:variable>
+        <xsl:variable name="email">
+          <xsl:value-of select="@email"/>
+        </xsl:variable>
+        <meta name="author" value="{$name}"/>
+        <meta name="email" value="{$email}"/>
+     </xsl:for-each>
+     </head>
+
+     <body bgcolor="{$body-bg}" text="{$body-fg}" link="{$body-link}"
+             alink="{$body-link}" vlink="{$body-link}">
+
+     <table border="0" width="100%" cellspacing="4">
+
+        <xsl:comment>PAGE HEADER</xsl:comment>
+        <tr><td colspan="2">
+
+          <xsl:comment>JAKARTA LOGO</xsl:comment>
+          <a href="http://jakarta.apache.org/">
+             <img src="http://jakarta.apache.org/images/jakarta-logo.gif"
+                 align="left" alt="The Jakarta Project" border="0"/>
+          </a>
+          <xsl:if test="$project/logo">
+             <xsl:variable name="alt">
+                <xsl:value-of select="$project/logo"/>
+             </xsl:variable>
+             <xsl:variable name="home">
+                <xsl:value-of select="$project/@href"/>
+             </xsl:variable>
+             <xsl:variable name="src">
+                <xsl:value-of select="$project/logo/@href"/>
+             </xsl:variable>
+
+             <xsl:comment>PROJECT LOGO</xsl:comment>
+             <a href="{$home}">
+                <img src="{$src}" align="right" alt="{$alt}" border="0"/>
+             </a>
+          </xsl:if>
+
+        </td></tr>
+
+        <xsl:comment>HEADER SEPARATOR</xsl:comment>
+        <tr>
+          <td colspan="2">
+             <hr noshade="" size="1"/>
+          </td>
+        </tr>
+
+        <tr>
+
+          <xsl:comment>LEFT SIDE NAVIGATION</xsl:comment>
+          <td width="20%" valign="top" nowrap="true">
+             <xsl:apply-templates select="$project/body/menu"/>
+          </td>
+
+          <xsl:comment>RIGHT SIDE MAIN BODY</xsl:comment>
+          <td width="80%" valign="top" align="left">
+             <xsl:apply-templates select="body/section"/>
+          </td>
+
+        </tr>
+
+        <xsl:comment>FOOTER SEPARATOR</xsl:comment>
+        <tr>
+          <td colspan="2">
+             <hr noshade="" size="1"/>
+          </td>
+        </tr>
+
+        <xsl:comment>PAGE FOOTER</xsl:comment>
+        <tr><td colspan="2">
+          <div align="center"><font color="{$body-link}" size="-1"><em>
+          Copyright &#169; 1999-2001, Apache Software Foundation
+          </em></font></div>
+        </td></tr>
+
+     </table>
+     </body>
+     </html>
 
   </xsl:template>
 
 
   <!-- Process a menu for the navigation bar -->
   <xsl:template match="menu">
-	 <p><strong><xsl:value-of select="@name"/></strong></p>
-	 <ul>
-		<xsl:apply-templates select="item"/>
-	 </ul>
+     <p><strong><xsl:value-of select="@name"/></strong></p>
+     <ul>
+        <xsl:apply-templates select="item"/>
+     </ul>
   </xsl:template>
 
 
   <!-- Process a menu item for the navigation bar -->
   <xsl:template match="item">
-	 <xsl:variable name="href">
-		<xsl:value-of select="$relative-path"/><xsl:value-of select="@href"/>
-	 </xsl:variable>
-	 <li><a href="{$href}"><xsl:value-of select="@name"/></a></li>
+     <xsl:variable name="href">
+        <xsl:value-of select="$relative-path"/><xsl:value-of select="@href"/>
+     </xsl:variable>
+     <li><a href="{$href}"><xsl:value-of select="@name"/></a></li>
   </xsl:template>
 
 
   <!-- Process a documentation section -->
   <xsl:template match="section">
-	 <xsl:variable name="name">
-		<xsl:value-of select="@anchor"/>
-	 </xsl:variable>
-	 <table border="0" cellspacing="0" cellpadding="2" width="100%">
-		<!-- Section heading -->
-		<tr><td bgcolor="{$banner-bg}">
-			 <font color="{$banner-fg}" face="arial,helvetica.sanserif">
-			 <a name="{$name}">
-			 <strong><xsl:value-of select="@name"/></strong></a></font>
-		</td></tr>
-		<!-- Section body -->
-		<tr><td><blockquote>
-		  <xsl:apply-templates/>
-		</blockquote></td></tr>
-	 </table>
+     <xsl:variable name="name">
+        <xsl:value-of select="@anchor"/>
+     </xsl:variable>
+     <table border="0" cellspacing="0" cellpadding="2" width="100%">
+        <!-- Section heading -->
+        <tr><td bgcolor="{$banner-bg}">
+             <font color="{$banner-fg}" face="arial,helvetica.sanserif">
+             <a name="{$name}">
+             <strong><xsl:value-of select="@name"/></strong></a></font>
+        </td></tr>
+        <!-- Section body -->
+        <tr><td><blockquote>
+          <xsl:apply-templates/>
+        </blockquote></td></tr>
+     </table>
   </xsl:template>
 
 
   <!-- Process a documentation subsection -->
   <xsl:template match="subsection">
-	 <xsl:variable name="anchor">
-		<xsl:value-of select="@anchor"/>
-	 </xsl:variable>
-	 <table border="0" cellspacing="0" cellpadding="2" width="100%">
-		<!-- Subsection heading -->
-		<tr><td bgcolor="{$sub-banner-bg}">
-			 <font color="{$sub-banner-fg}" face="arial,helvetica.sanserif">
-			 <a name="{$anchor}">
-			 <strong><xsl:value-of select="@name"/></strong></a></font>
-		</td></tr>
-		<!-- Subsection body -->
-		<tr><td><blockquote>
-		  <xsl:apply-templates/>
-		</blockquote></td></tr>
-	 </table>
+     <xsl:variable name="anchor">
+        <xsl:value-of select="@anchor"/>
+     </xsl:variable>
+     <table border="0" cellspacing="0" cellpadding="2" width="100%">
+        <!-- Subsection heading -->
+        <tr><td bgcolor="{$sub-banner-bg}">
+             <font color="{$sub-banner-fg}" face="arial,helvetica.sanserif">
+             <a name="{$anchor}">
+             <strong><xsl:value-of select="@name"/></strong></a></font>
+        </td></tr>
+        <!-- Subsection body -->
+        <tr><td><blockquote>
+          <xsl:apply-templates/>
+        </blockquote></td></tr>
+     </table>
   </xsl:template>
 
 
   <!-- Process a source code example -->
   <xsl:template match="source">
-	 <div align="left">
-		<table cellspacing="4" cellpadding="0" border="0">
-		  <tr>
-			 <td bgcolor="{$source-color}" width="1" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-			 <td bgcolor="{$source-color}" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-			 <td bgcolor="{$source-color}" width="1" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-		  </tr>
-		  <tr>
-			 <td bgcolor="{$source-color}" width="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-			 <td bgcolor="#ffffff" height="1"><pre>
-				<xsl:value-of select="."/>
-			 </pre></td>
-			 <td bgcolor="{$source-color}" width="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-		  </tr>
-		  <tr>
-			 <td bgcolor="{$source-color}" width="1" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-			 <td bgcolor="{$source-color}" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-			 <td bgcolor="{$source-color}" width="1" height="1">
-				<img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
-			 </td>
-		  </tr>
-		</table>
-	 </div>
+     <div align="left">
+        <table cellspacing="4" cellpadding="0" border="0">
+          <tr>
+             <td bgcolor="{$source-color}" width="1" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+             <td bgcolor="{$source-color}" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+             <td bgcolor="{$source-color}" width="1" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+          </tr>
+          <tr>
+             <td bgcolor="{$source-color}" width="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+             <td bgcolor="#ffffff" height="1"><pre>
+                <xsl:value-of select="."/>
+             </pre></td>
+             <td bgcolor="{$source-color}" width="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+          </tr>
+          <tr>
+             <td bgcolor="{$source-color}" width="1" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+             <td bgcolor="{$source-color}" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+             <td bgcolor="{$source-color}" width="1" height="1">
+                <img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/>
+             </td>
+          </tr>
+        </table>
+     </div>
   </xsl:template>
 
 
   <!-- Process everything else by just passing it through -->
   <xsl:template match="*|@*">
-	 <xsl:copy>
-		<xsl:apply-templates select="@*|*|text()"/>
-	 </xsl:copy>
+     <xsl:copy>
+        <xsl:apply-templates select="@*|*|text()"/>
+     </xsl:copy>
   </xsl:template>
 
 </xsl:stylesheet>