diff --git a/src/xml/expr_arith.y b/src/xml/expr_arith.y
index 302c003690..9c83837eec 100644
--- a/src/xml/expr_arith.y
+++ b/src/xml/expr_arith.y
@@ -100,18 +100,26 @@ extern "C"
 stmt:   expr                { result = static_cast<int>($1);}
         |                   { result = 0; }
         ;
-                            //TODO Pass Xpath base for search
-expr:   STRING              { float val = 0.0;
 
-                              ostringstream  xpath_t;
+expr:   STRING              { float val = 0.0;
 
                               vector<string> results;
 
-                              xpath_t << "/HOST/TEMPLATE/" << $1
-                                      << "|/HOST/HOST_SHARE/" << $1
-                                      << "|/HOST/CLUSTER_TEMPLATE/" << $1;
+                              if ($1[0] == '/')
+                              {
+                                  results = (*oxml)[$1];
+                              }
+                              else
+                              {
+                                  ostringstream  xpath_t;
 
-                              results = (*oxml)[xpath_t.str().c_str()];
+                                  xpath_t << "/HOST/TEMPLATE/" << $1
+                                          << "|/HOST/HOST_SHARE/" << $1
+                                          << "|/HOST/" << $1
+                                          << "|/HOST/CLUSTER_TEMPLATE/" << $1;
+
+                                  results = (*oxml)[xpath_t.str().c_str()];
+                              }
 
                               if (results.size() != 0)
                               {
diff --git a/src/xml/expr_bool.y b/src/xml/expr_bool.y
index 09ca612c5c..f921b91c73 100644
--- a/src/xml/expr_bool.y
+++ b/src/xml/expr_bool.y
@@ -71,6 +71,8 @@ int get_xml_attribute(ObjectXML * oxml, const char* attr, float& val);
 
 int get_xml_attribute(ObjectXML * oxml, const char* attr, string& val);
 
+void get_xml_values(ObjectXML * oxml, const char* attr, vector<string>& results);
+
 %}
 
 %parse-param {mem_collector * mc}
@@ -190,20 +192,31 @@ extern "C" void expr_bool__error(
     result = false;
 }
 
+void get_xml_values(ObjectXML * oxml, const char* attr, vector<string> &results)
+{
+    if (attr[0] == '/')
+    {
+        results = (*oxml)[attr];
+    }
+    else
+    {
+        ostringstream  xpath;
+
+        xpath << "/HOST/TEMPLATE/" << attr
+            << "|/HOST/HOST_SHARE/" << attr
+            << "|/HOST/" << attr
+            << "|/HOST/CLUSTER_TEMPLATE/" << attr;
+
+        results = (*oxml)[xpath.str().c_str()];
+    }
+}
+
 int get_xml_attribute(ObjectXML * oxml, const char* attr, int& val)
 {
     val = 0;
 
-    //TODO: pass xpath base
     vector<string> results;
-    ostringstream  xpath_t;
-
-    xpath_t << "/HOST/TEMPLATE/" << attr
-        << "|/HOST/HOST_SHARE/" << attr
-        << "|/HOST/" << attr
-        << "|/HOST/CLUSTER_TEMPLATE/" << attr;
-
-    results = (*oxml)[xpath_t.str().c_str()];
+    get_xml_values(oxml, attr, results);
 
     if (results.size() != 0)
     {
@@ -227,16 +240,8 @@ int get_xml_attribute(ObjectXML * oxml, const char* attr, float& val)
 {
     val = 0.0;
 
-    //TODO: pass xpath base
-    ostringstream  xpath_t;
     vector<string> results;
-
-    xpath_t << "/HOST/TEMPLATE/" << attr
-        << "|/HOST/HOST_SHARE/" << attr
-        << "|/HOST/" << attr
-        << "|/HOST/CLUSTER_TEMPLATE/" << attr;
-
-    results = (*oxml)[xpath_t.str().c_str()];
+    get_xml_values(oxml, attr, results);
 
     if (results.size() != 0)
     {
@@ -260,16 +265,8 @@ int get_xml_attribute(ObjectXML * oxml, const char* attr, string& val)
 {
     val = "";
 
-    //TODO: pass xpath base
-    ostringstream  xpath_t;
     vector<string> results;
-
-    xpath_t << "/HOST/TEMPLATE/" << attr
-        << "|/HOST/HOST_SHARE/" << attr
-        << "|/HOST/" << attr
-        << "|/HOST/CLUSTER_TEMPLATE/" << attr;
-
-    results = (*oxml)[xpath_t.str().c_str()];
+    get_xml_values(oxml, attr, results);
 
     if (results.size() != 0)
     {