diff --git a/examples/georss-flickr.html b/examples/georss-flickr.html
index 7780bef6d0..bc76d0b601 100644
--- a/examples/georss-flickr.html
+++ b/examples/georss-flickr.html
@@ -41,6 +41,7 @@
// If the above rule does not apply, use a smaller pointRadius.
var elseRule = new OpenLayers.Rule({
+ elseFilter: true,
symbolizer: {"Point": {pointRadius: 20}}});
style.addRules([rule, elseRule]);
@@ -69,7 +70,7 @@
popupControl.activate();
- OpenLayers.loadURL("xml/georss-flickr.xml", "", null, afterload);
+ OpenLayers.loadURL("xml/georss-flickr.xml", null, window, afterload);
}
@@ -88,13 +89,9 @@
var store = new OpenLayers.Format.GeoRSS({
createFeatureFromItem: createFeatureFromItem});
- rss = store.read(req.responseXML);
+ rss = store.read(req.responseText);
- // get the title of the RSS feed
- var title = req.responseXML.getElementsByTagName("title")[0]
- .firstChild.nodeValue;
-
- markerLayer.setName(title);
+ markerLayer.setName("Some images from Flickr");
markerLayer.addFeatures(rss);
}
diff --git a/lib/OpenLayers/Format/SLD.js b/lib/OpenLayers/Format/SLD.js
index 942f73b540..24a20df762 100644
--- a/lib/OpenLayers/Format/SLD.js
+++ b/lib/OpenLayers/Format/SLD.js
@@ -207,9 +207,16 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
if (filter && filter.length > 0) {
var rule = this.parseFilter(filter[0]);
} else {
- // rule applies to all features (no filter or ElseFilter)
+ // start with an empty rule that always applies
var rule = new OpenLayers.Rule();
+ // and check if the rule is an ElseFilter
+ var elseFilter = this.getElementsByTagNameNS(xmlNode, this.ogcns,
+ "ElseFilter");
+ if (elseFilter && elseFilter.length > 0) {
+ rule.elseFilter = true;
+ }
}
+
rule.name = name;
// SCALE DENOMINATORS
diff --git a/lib/OpenLayers/Rule.js b/lib/OpenLayers/Rule.js
index c207688b92..9f6cb3329c 100644
--- a/lib/OpenLayers/Rule.js
+++ b/lib/OpenLayers/Rule.js
@@ -20,6 +20,16 @@ OpenLayers.Rule = OpenLayers.Class({
*/
name: 'default',
+ /**
+ * Property: elseFilter
+ * {Boolean} Determines whether this rule is only to be applied only if
+ * no other rules match (ElseFilter according to the SLD specification).
+ * Default is false. For instances of OpenLayers.Rule, if elseFilter is
+ * false, the rule will always apply. For subclasses, the else property is
+ * ignored.
+ */
+ elseFilter: false,
+
/**
* Property: symbolizer
* {Object} Hash of styles for this rule. Contains hashes of feature
diff --git a/lib/OpenLayers/Style.js b/lib/OpenLayers/Style.js
index a5f1dd920b..3ac971d03e 100644
--- a/lib/OpenLayers/Style.js
+++ b/lib/OpenLayers/Style.js
@@ -111,12 +111,13 @@ OpenLayers.Style = OpenLayers.Class({
var style = OpenLayers.Util.extend({}, this.defaultStyle);
var rules = this.rules;
- var draw = rules.length == 0 ? true : false;
var rule;
- for (var i=0; i 0) {
+ appliedRules = true;
+ for(var i=0; i 0 && appliedRules == false) {
+ style.display = "none";
+ } else {
+ style.display = "";
+ }
return style;
},
+ /**
+ * Method: applySymbolizer
+ *
+ * Parameters:
+ * rule - {OpenLayers.Rule}
+ * style - {Object}
+ * feature - {}
+ *
+ * Returns:
+ * {Object} A style with new symbolizer applied.
+ */
+ applySymbolizer: function(rule, style, feature) {
+ var symbolizerPrefix = feature.geometry ?
+ this.getSymbolizerPrefix(feature.geometry) :
+ OpenLayers.Style.SYMBOLIZER_PREFIXES[0];
+
+ // merge the style with the current style
+ var symbolizer = rule.symbolizer[symbolizerPrefix];
+ return OpenLayers.Util.extend(style, symbolizer);
+ },
+
/**
* Method: createLiterals
* creates literals for all style properties that have an entry in
diff --git a/tests/test_Style.html b/tests/test_Style.html
index 17d3184cba..3c9af04ea2 100644
--- a/tests/test_Style.html
+++ b/tests/test_Style.html
@@ -87,6 +87,33 @@
createdStyle = style.createStyle(feature);
t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\".");
}
+
+ function test_Style_createStyle(t) {
+ t.plan(2);
+ var style = new OpenLayers.Style();
+ var rule = new OpenLayers.Rule({
+ id: Math.random()
+ });
+ var elseRule = new OpenLayers.Rule({
+ id: Math.random(),
+ elseFilter: true
+ });
+ style.addRules([rule, elseRule]);
+
+ // test that applySymbolizer is only called with rule
+ style.applySymbolizer = function(r) {
+ t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule");
+ }
+ style.createStyle(new OpenLayers.Feature.Vector());
+
+ rule.evaluate = function() {return false;};
+ style.applySymbolizer = function(r) {
+ t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule");
+ }
+ style.createStyle(new OpenLayers.Feature.Vector());
+
+
+ }
function test_Style_destroy(t) {
t.plan(1);