data tree FEATURE function for evaluating xpath on data
Just added a public API for internal function.
diff --git a/src/tree_data.c b/src/tree_data.c
index b7d21b7..fd14dc8 100644
--- a/src/tree_data.c
+++ b/src/tree_data.c
@@ -2580,3 +2580,48 @@
lyd_free_tree(target);
return rc;
}
+
+API LY_ERR
+lyd_find_xpath(const struct lyd_node *ctx_node, const char *xpath, struct ly_set **set)
+{
+ LY_ERR ret = LY_SUCCESS;
+ struct lyxp_set xp_set;
+ struct lyxp_expr *exp;
+ uint32_t i;
+
+ LY_CHECK_ARG_RET(NULL, ctx_node, xpath, set, LY_EINVAL);
+
+ memset(&xp_set, 0, sizeof xp_set);
+
+ /* compile expression */
+ exp = lyxp_expr_parse((struct ly_ctx *)LYD_NODE_CTX(ctx_node), xpath);
+ LY_CHECK_ERR_GOTO(!exp, ret = LY_EINVAL, cleanup);
+
+ /* evaluate expression */
+ ret = lyxp_eval(exp, LYD_JSON, ctx_node->schema->module, ctx_node, LYXP_NODE_ELEM, ctx_node, &xp_set, 0);
+ LY_CHECK_GOTO(ret, cleanup);
+
+ /* allocate return set */
+ *set = ly_set_new();
+ LY_CHECK_ERR_GOTO(!*set, LOGMEM(LYD_NODE_CTX(ctx_node)); ret = LY_EMEM, cleanup);
+
+ /* transform into ly_set */
+ if (xp_set.type == LYXP_SET_NODE_SET) {
+ /* allocate memory for all the elements once (even though not all items must be elements but most likely will be) */
+ (*set)->objs = malloc(xp_set.used * sizeof *(*set)->objs);
+ LY_CHECK_ERR_GOTO(!(*set)->objs, LOGMEM(LYD_NODE_CTX(ctx_node)); ret = LY_EMEM, cleanup);
+ (*set)->size = xp_set.used;
+
+ for (i = 0; i < xp_set.used; ++i) {
+ if (xp_set.val.nodes[i].type == LYXP_NODE_ELEM) {
+ ly_set_add(*set, xp_set.val.nodes[i].node, LY_SET_OPT_USEASLIST);
+ }
+ }
+ }
+
+cleanup:
+ //lyxp_set_free_content(&xp_set);
+ lyxp_set_cast(&xp_set, LYXP_SET_EMPTY);
+ lyxp_expr_free((struct ly_ctx *)LYD_NODE_CTX(ctx_node), exp);
+ return ret;
+}