private Bind getBindByNodesetRecursive(Bind bind, String searchedNodeset, String accNodeset) {
    String ns = bind.getAttributes().get("nodeset");
    if (ns != null) accNodeset += "/" + ns;

    if (accNodeset.equals(searchedNodeset) || accNodeset.substring(1).equals(searchedNodeset)) {
      // found matching bind (first / is optional)
      return bind;
    } else if (bind.getBinds().size() > 0) {
      // not found, continue search in child binds
      for (Bind nestedBind : bind.getBinds()) {
        Bind result = getBindByNodesetRecursive(nestedBind, searchedNodeset, accNodeset);
        if (result != null) return result;
      }
      return null;
    } else {
      // not found, no children
      return null;
    }
  }
  private void appendElementERDF(Writer writer, XFormsElement element) throws IOException {
    writer.append("<div id=\"" + element.getResourceId() + "\">");
    appendOryxField(writer, "type", STENCILSET_URI + "#" + element.getStencilId());

    for (String field : element.getAttributes().keySet()) {
      if (!field.equals("bind"))
        appendXFormsField(writer, field, element.getAttributes().get(field));
    }

    // handle PCData containers
    if (element instanceof PCDataContainer) {
      String content = ((PCDataContainer) element).getContent();
      if (element instanceof Label) {
        appendXFormsField(writer, "text", content);
      } else {
        appendXFormsField(writer, "message", content);
      }
    }

    // handle model item properties
    String ref = element.getAttributes().get("ref");
    if (ref != null) {

      if (!ref.startsWith("/") && (element instanceof XFormsUIElement)) {
        ref = getNodesetContext((XFormsUIElement) element) + ref;
      }

      Bind bind = getBindByNodeset(ref);

      if (bind != null) {
        for (String field : bind.getAttributes().keySet()) {
          if (!field.equals("id") && !field.equals("nodeset"))
            appendXFormsField(writer, field, bind.getAttributes().get(field));
        }
      }
    }

    // handle submission properties
    String submissionId = element.getAttributes().get("submission");
    if (submissionId != null) {
      Submission submission = getSubmissionById(submissionId);
      if (submission != null) {
        for (String field : submission.getAttributes().keySet()) {
          if (!field.equals("id"))
            appendXFormsField(writer, field, submission.getAttributes().get(field));
        }
      }
    }

    // handle item element
    if (element instanceof Item) {
      Item item = (Item) element;
      Value value = item.getValue();
      if (value != null) {
        for (String field : value.getAttributes().keySet()) {
          if (!field.equals("id"))
            appendXFormsField(writer, "value_" + field, value.getAttributes().get(field));
        }
      }
      appendOryxField(writer, "bounds", "0," + item.getYPosition() + ",0," + item.getYPosition());
    }

    // handle itemset element
    if (element instanceof Itemset) {
      Itemset itemset = (Itemset) element;
      Value value = itemset.getValue();
      if (value != null) {
        for (String field : value.getAttributes().keySet()) {
          appendXFormsField(writer, "value_" + field, value.getAttributes().get(field));
        }
      }
      Copy copy = ((Itemset) element).getCopy();
      if (copy != null) {
        for (String field : copy.getAttributes().keySet()) {
          appendXFormsField(writer, "copy_" + field, copy.getAttributes().get(field));
        }
      }
      appendOryxField(
          writer, "bounds", "0," + itemset.getYPosition() + ",0," + itemset.getYPosition());
    }

    if (element instanceof XFormsUIElement) {
      int x = ((XFormsUIElement) element).getXPosition();
      int y = (((XFormsUIElement) element).getYPosition() + 10) * DISTANCE_FACTOR;
      appendOryxField(writer, "bounds", x + "," + y + "," + x + "," + y);
    }

    writer.append(
        "<a rel=\"raziel-parent\" href=\"#" + context.getParent(element).getResourceId() + "\"/>");
    writer.append("</div>");
  }