示例#1
0
    @Override
    public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
      NodeInfo stylesheet = (NodeInfo) arguments[0].head();
      NodeInfo node = (NodeInfo) arguments[1].head();

      Evaluator eval = SearchBase.getEvaluator(context);
      XsltCompiler xsltCompiler = eval.getCompiler().getXsltCompiler();
      xsltCompiler.setErrorListener(eval.getErrorListener());
      try {
        // TODO: cache compiled xslt somewhere
        XsltExecutable xsltexec = xsltCompiler.compile(stylesheet);
        transformer = xsltexec.load();
        transformer.setSource(node);
        transformer.setErrorListener(eval.getErrorListener());
        if (arguments.length > 2) {
          bindParameters(arguments[2]);
        }
        XdmDestination dest = new XdmDestination();
        transformer.setDestination(dest);
        transformer.transform();
        ArrayList<TransformerException> runtimeErrors =
            ((TransformErrorListener) transformer.getErrorListener()).getErrors();
        if (!runtimeErrors.isEmpty()) {
          throw new XPathException(
              runtimeErrors.get(0).getMessage(),
              runtimeErrors.get(0).getLocator(),
              runtimeErrors.get(0));
        }
        XdmNode result = dest.getXdmNode();
        if (result == null) {
          return EmptySequence.getInstance();
        }
        return result.getUnderlyingNode();
      } catch (SaxonApiException e) {
        throw new XPathException(e);
      }
    }
  private void runAdjacent() throws SaxonApiException {
    TreeWriter treeWriter = null;
    String last = null;
    boolean open = false;

    int count = 0;
    while (source.moreDocuments()) {
      count++;
      source.read();
    }
    source.resetReader();

    DocumentSequenceIterator xsi = new DocumentSequenceIterator(); // See below
    xsi.setLast(count);

    int pos = 0;
    while (source.moreDocuments()) {
      XdmNode node = source.read();
      pos++;

      Item item = null;

      try {
        XPathCompiler xcomp = runtime.getProcessor().newXPathCompiler();
        xcomp.setBaseURI(step.getNode().getBaseURI());

        for (String prefix : groupAdjacent.getNamespaceBindings().keySet()) {
          xcomp.declareNamespace(prefix, groupAdjacent.getNamespaceBindings().get(prefix));
        }

        XPathExecutable xexec = xcomp.compile(groupAdjacent.getString());

        // From Michael Kay: http://markmail.org/message/vkb2vaq2miylgndu
        //
        // Underneath the s9api XPathExecutable is a net.sf.saxon.sxpath.XPathExpression.

        XPathExpression xexpr = xexec.getUnderlyingExpression();

        // Call createDynamicContext() on this to get an XPathDynamicContext object;

        XPathDynamicContext xdc = xexpr.createDynamicContext(node.getUnderlyingNode());

        // call getXPathContextObject() on that to get the underlying XPathContext.

        XPathContext xc = xdc.getXPathContextObject();

        // Then call XPathContext.setCurrentIterator()
        // to supply a SequenceIterator whose current() and position() methods return
        // the context item and position respectively. If there's any risk that the
        // expression will call the last() method, then it's simplest to make your
        // iterator's getProperties() return LAST_POSITION_FINDER, and implement the
        // LastPositionFinder interface, in which case last() will be implemented by
        // calling the iterator's getLastPosition() method. (Otherwise last() is
        // implemented by calling getAnother() to clone the iterator and calling next()
        // on the clone until the end of the sequence is reached).

        xsi.setPosition(pos);
        xsi.setItem(node.getUnderlyingNode());
        xc.setCurrentIterator(xsi);

        // Then evaluate the expression by calling iterate() on the
        // net.sf.saxon.sxpath.XPathExpression object.

        SequenceIterator results = xexpr.iterate(xdc);
        item = results.next();

        if (item == null) {
          throw new XProcException(
              step.getNode(), "The group-adjacent expression returned nothing.");
        }

        if (results.next() != null) {
          throw new XProcException(
              step.getNode(), "Didn't expect group-adjacent to return a sequence!");
        }
      } catch (XPathException xe) {
        throw new XProcException(xe);
      }

      //
      //  Good luck!
      //

      // FIXME: Compute effective boolean value in a more robust way
      String cur = item.getStringValue();

      if (last != null) {
        if (last.equals(cur)) {
          treeWriter.addSubtree(node);
        } else {
          if (open) {
            open = false;
            treeWriter.addEndElement();
            treeWriter.endDocument();
            result.write(treeWriter.getResult());
          }
        }
      }

      if (last == null || !last.equals(cur)) {
        last = cur;
        open = true;
        treeWriter = new TreeWriter(runtime);
        treeWriter.startDocument(step.getNode().getBaseURI());
        treeWriter.addStartElement(wrapper);
        treeWriter.startContent();
        treeWriter.addSubtree(node);
      }
    }

    if (open) {
      open = false;
      treeWriter.addEndElement();
      treeWriter.endDocument();
      result.write(treeWriter.getResult());
    }
  }
示例#3
0
 protected TextNodeDescendantIterator(XdmNode node) {
   super(
       node.getUnderlyingNode()
           .iterateAxis(Axis.DESCENDANT_OR_SELF.getAxisNumber(), NodeKindTest.TEXT));
 }