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');