diff --git a/src/ol/parser/ogc/filter_v1.js b/src/ol/parser/ogc/filter_v1.js index f898b9f6b0..b390e61db6 100644 --- a/src/ol/parser/ogc/filter_v1.js +++ b/src/ol/parser/ogc/filter_v1.js @@ -28,28 +28,34 @@ ol.parser.ogc.Filter_v1 = function() { this.readers = { 'http://www.opengis.net/ogc': { _expression: function(node) { - var obj, value = ''; + var obj, source = ''; for (var child = node.firstChild; child; child = child.nextSibling) { switch (child.nodeType) { case 1: obj = this.readNode(child); if (obj.property) { - value += obj.property.getName(); + var name = obj.property.getName(); + source += (source !== '') ? '+' + name : name; } else if (goog.isDef(obj.value)) { - if (obj.value instanceof ol.expr.Literal) { - value += obj.value.getValue(); - } + return obj.value; } break; case 3: // text node case 4: // cdata section - value += child.nodeValue; + if (source !== '') { + source += '+'; + } + if (isNaN(goog.string.toNumber(child.nodeValue))) { + source += goog.string.quote(goog.string.trim(child.nodeValue)); + } else { + source += goog.string.trim(child.nodeValue); + } break; default: break; } } - return ol.expr.parse(goog.string.trim(value)); + return ol.expr.parse(source); }, 'Filter': function(node, obj) { var container = { diff --git a/test/spec/ol/parser/ogc/filter_v1_0_0.test.js b/test/spec/ol/parser/ogc/filter_v1_0_0.test.js index 43aaa54201..87ec4afffa 100644 --- a/test/spec/ol/parser/ogc/filter_v1_0_0.test.js +++ b/test/spec/ol/parser/ogc/filter_v1_0_0.test.js @@ -235,6 +235,24 @@ describe('ol.parser.ogc.Filter_v1_0_0', function() { }); + describe('_expression reader works as expected', function() { + it('_expression reader handles combined propertyname and literal', + function() { + var xml = '10'; + var reader = parser.readers['http://www.opengis.net/ogc'][ + '_expression']; + var expr = reader.call(parser, goog.dom.xml.loadXml( + xml).documentElement); + expect(expr instanceof ol.expr.Literal).to.be.ok(); + expect(expr.getValue()).to.equal(10); + xml = '' + + 'fooxbar'; + expr = reader.call(parser, goog.dom.xml.loadXml(xml).documentElement); + expect(expr.evaluate({x: 4})).to.eql('foo4bar'); + }); + }); + }); goog.require('goog.dom.xml');