Index: tests/Format/SLD/v1_0_0.html
===================================================================
--- tests/Format/SLD/v1_0_0.html	(revision 9178)
+++ tests/Format/SLD/v1_0_0.html	(working copy)
@@ -125,13 +125,23 @@
         '</StyledLayerDescriptor>';
 
     function test_read(t) {
-        t.plan(21);
+        t.plan(24);
         
         var xml = new OpenLayers.Format.XML();
         var sldxml = xml.read(sld);
         
+        // test that defaultsPerSymbolizers works
+        var parser = new OpenLayers.Format.SLD({defaultsPerSymbolizer: true});
+        var obj = parser.read(sldxml);
+
+        var rule = obj.namedLayers["AAA161"].userStyles[0].rules[0];
+        t.eq(rule.symbolizer["Polygon"].fillOpacity, 1, "default fill opacity applied to rule")
+        t.eq(rule.symbolizer["Polygon"].strokeWidth, 1, "default stroke width applied to rule")
+        rule = obj.namedLayers["Second Layer"].userStyles[0].rules[0];
+        t.eq(rule.symbolizer["Point"].pointRadius, 3, "default point radius applied to rule")
+
         // test that format options are considered in read
-        var parser = new OpenLayers.Format.SLD({
+        parser = new OpenLayers.Format.SLD({
             version: "1.0.0",
             namedLayersAsArray: true
         });
@@ -152,7 +162,7 @@
         }        
         t.eq(count, arrayLen, "number of named layers in array equals number of named layers in object");
         
-        var layer, style, rule;
+        var layer, style;
         
         // check the first named layer
         layer = obj.namedLayers["AAA161"];
Index: lib/OpenLayers/Format/SLD/v1.js
===================================================================
--- lib/OpenLayers/Format/SLD/v1.js	(revision 9178)
+++ lib/OpenLayers/Format/SLD/v1.js	(working copy)
@@ -231,9 +231,24 @@
                 rule.symbolizer["Point"] = symbolizer;
             },
             "Stroke": function(node, symbolizer) {
+                if(this.defaultsPerSymbolizer) {
+                    OpenLayers.Util.applyDefaults(symbolizer, {
+                        strokeWidth: this.defaultSymbolizer.strokeWidth,
+                        strokeColor: this.defaultSymbolizer.strokeColor,
+                        strokeOpacity: this.defaultSymbolizer.strokeOpacity,
+                        strokeDashstyle: this.defaultSymbolizer.strokeDashstyle
+                    });
+                }
                 this.readChildNodes(node, symbolizer);
+                this.readChildNodes(node, symbolizer);
             },
             "Fill": function(node, symbolizer) {
+                if(this.defaultsPerSymbolizer) {
+                    OpenLayers.Util.applyDefaults(symbolizer, {
+                        fillColor: this.defaultSymbolizer.fillColor,
+                        fillOpacity: this.defaultSymbolizer.fillOpacity
+                    });
+                }
                 this.readChildNodes(node, symbolizer);
             },
             "CssParameter": function(node, symbolizer) {
@@ -250,6 +265,12 @@
             },
             "Graphic": function(node, symbolizer) {
                 var graphic = {};
+                if(this.defaultsPerSymbolizer) {
+                    OpenLayers.Util.applyDefaults(symbolizer, {
+                        pointRadius: this.defaultSymbolizer.pointRadius,
+                        graphicName: this.defaultSymbolizer.graphicName
+                    });
+                }
                 // painter's order not respected here, clobber previous with next
                 this.readChildNodes(node, graphic);
                 // directly properties with names that match symbolizer properties
Index: lib/OpenLayers/Format/SLD.js
===================================================================
--- lib/OpenLayers/Format/SLD.js	(revision 9178)
+++ lib/OpenLayers/Format/SLD.js	(working copy)
@@ -43,6 +43,15 @@
     namedLayersAsArray: false,
     
     /**
+     * APIProperty: defaultsPerSymbolizer
+     * {Boolean} If set to true, each symbolizer of a rule will be extended with
+     * the <defaultSymbolizer>. This is only useful if rules are intended to be
+     * rendered standalone, e.g. in legends where usually each rule of a style
+     * is rendered separately. Default is false.
+     */
+    defaultsPerSymbolizer: false,
+    
+    /**
      * Property: parser
      * {Object} Instance of the versioned parser.  Cached for multiple read and
      *     write calls of the same version.
