@Override
  public void execute_node(
      SesameDataSet dataset,
      String expression,
      TriplesMap parentTriplesMap,
      RMLPerformer performer,
      Object node,
      Resource subject) {
    // still need to make it work with more nore-results
    // currently it handles only one

    if (expression.startsWith("/")) expression = expression.substring(1);

    Node node2 = (Node) node;
    Nodes nodes = node2.query(expression, nsContext);

    for (int i = 0; i < nodes.size(); i++) {
      Node n = nodes.get(i);
      if (subject == null) performer.perform(n, dataset, parentTriplesMap);
      else {
        RMLProcessorFactory factory = new ConcreteRMLProcessorFactory();
        RMLProcessor subprocessor =
            factory.create(map.getLogicalSource().getReferenceFormulation());
        RMLPerformer subperformer = new NodeRMLPerformer(subprocessor);
        subperformer.perform(n, dataset, parentTriplesMap, subject);
      }
    }
  }
  public String execute(Node node, String expression) throws SaxonApiException {

    Processor proc = new Processor(false);
    XPathCompiler xpath = proc.newXPathCompiler();
    DocumentBuilder builder = proc.newDocumentBuilder();

    String source = getClass().getResource(map.getLogicalSource().getIdentifier()).getFile();

    XdmNode doc = builder.build(new File(source));
    String expre = replace(node, expression);
    expression =
        expression.replaceAll(
            "\\{" + expression.split("\\{")[1].split("\\}")[0] + "\\}", "'" + expre + "'");

    XPathSelector selector = xpath.compile(expression).load();
    selector.setContextItem(doc);

    // Evaluate the expression.
    Object result = selector.evaluate();

    return result.toString();
  }
  @Override
  public void execute(
      final SesameDataSet dataset,
      final TriplesMap map,
      final RMLPerformer performer,
      InputStream input) {
    try {
      this.map = map;
      String reference = getReference(map.getLogicalSource());
      // Inititalize the XMLDog for processing XPath
      // an implementation of javax.xml.namespace.NamespaceContext
      // DefaultNamespaceContext dnc = new DefaultNamespaceContext();
      DefaultNamespaceContext dnc = get_namespaces();
      XMLDog dog = new XMLDog(dnc);

      // adding expression to the xpathprocessor
      dog.addXPath(reference);

      jlibs.xml.sax.dog.sniff.Event event = dog.createEvent();

      // event.setXMLBuilder(new DOMBuilder());
      // use XOM now
      event.setXMLBuilder(new XOMBuilder());

      event.setListener(
          new InstantEvaluationListener() {
            // When an XPath expression matches
            @Override
            public void onNodeHit(Expression expression, NodeItem nodeItem) {
              Node node = (Node) nodeItem.xml;
              // if(!nodeItem.namespaceURI.isEmpty())
              // log.info("namespace? " + nodeItem.namespaceURI);
              // else
              // log.info("no namespace.");
              // Let the performer do its thing
              performer.perform(node, dataset, map);
              // System.out.println("XPath: " + expression.getXPath() + " has hit: " +
              // node.getTextContent());
            }

            @Override
            public void finishedNodeSet(Expression expression) {
              // System.out.println("Finished Nodeset: " + expression.getXPath());
            }

            @Override
            public void onResult(Expression expression, Object result) {
              // this method is called only for xpaths which returns primitive result
              // i.e result will be one of String, Boolean, Double
              // System.out.println("XPath: " + expression.getXPath() + " result: " + result);
            }
          });
      // Execute the streaming

      // dog.sniff(event, new InputSource(new FileInputStream(fileName)));
      dog.sniff(event, new InputSource(input));
    } catch (SAXPathException ex) {
      Logger.getLogger(XPathProcessor.class.getName()).log(Level.SEVERE, null, ex);
    } catch (XPathException ex) {
      Logger.getLogger(XPathProcessor.class.getName()).log(Level.SEVERE, null, ex);
    }
  }