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("Building Portfolio List")
- def pfoList = "<PfoList>"
- def pfoNr = 1
- def pfo = vars.get("Pfo_" + pfoNr)
- while(pfo != null) {
- println("Pfo: $pfo");
- pfoList = pfoList + "<Pfo ID='$pfo' EmptyValuation='true' PropagatePrice='true'/>"
- pfoNr++
- pfo = vars.get("Pfo_" + pfoNr)
- }
- pfoList = pfoList + "</PfoList>"
- vars.put("PfoListXML", pfoList)
+ // build Pfo List
+ println("Building Portfolio List")
+ def pfoList = "<PfoList>"
+ def pfoNr = 1
+ def pfo = vars.get("Pfo_" + pfoNr)
+ while(pfo != null) {
+ println("Pfo: $pfo");
+ pfoList = pfoList + "<Pfo ID='$pfo' EmptyValuation='true' PropagatePrice='true'/>"
+ pfoNr++
+ pfo = vars.get("Pfo_" + pfoNr)
+ }
+ pfoList = pfoList + "</PfoList>"
+ vars.put("PfoListXML", 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 © 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 © 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>