Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * SplitSequence.java
   *
   * Copyright 2008 Mark Logic Corporation.
   * Portions Copyright 2007 Sun Microsystems, Inc.
   * All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * https://xproc.dev.java.net/public/CDDL+GPL.html or
  * docs/CDDL+GPL.txt in the distribution. See the License for the
  * specific language governing permissions and limitations under the
  * License. When distributing the software, include this License Header
  * Notice in each file and include the License file at docs/CDDL+GPL.txt.
  */
 
 package com.xmlcalabash.library;
 
 

Author(s):
ndw
 
 public class SplitSequence extends DefaultStep {
     private static final QName _test = new QName("""test");
     private static final QName _initial_only = new QName("""initial-only");
     private ReadablePipe source = null;
     private WritablePipe matched = null;
     private WritablePipe notMatched = null;
     private boolean initialOnly = false;

    
Creates a new instance of SplitSequence
 
     public SplitSequence(XProcRuntime runtimeXAtomicStep step) {
         super(runtime,step);
     }
 
     public void setInput(String portReadablePipe pipe) {
          = pipe;
     }
 
     public void setOutput(String portWritablePipe pipe) {
         if ("matched".equals(port)) {
              = pipe;
         } else {
              = pipe;
         }
     }
 
     public void reset() {
         .resetReader();
         .resetWriter();
         .resetWriter();
     }
 
     public void run() throws SaxonApiException {
         super.run();
 
         RuntimeValue test = getOption();
          = getOption(false);
         boolean stillOk = true;
 
         int count = 0;
         while (.moreDocuments()) {
             count++;
             .read();
         }
         .resetReader();
 
         DocumentSequenceIterator xsi = new DocumentSequenceIterator(); // See below
         xsi.setLast(count);
 
         int pos = 0;
         while (.moreDocuments()) {
             XdmNode doc = .read();
             pos++;
 
            Item item = null;
            try {
                XPathCompiler xcomp = .getProcessor().newXPathCompiler();
                xcomp.setBaseURI(.getNode().getBaseURI());
                for (String prefix : test.getNamespaceBindings().keySet()) {
                    xcomp.declareNamespace(prefixtest.getNamespaceBindings().get(prefix));
                }
                XPathExecutable xexec = xcomp.compile(test.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(doc.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(doc.getUnderlyingNode());
                xc.setCurrentIterator(xsi);
                // Then evaluate the expression by calling iterate() on the
                // net.sf.saxon.sxpath.XPathExpression object.
                SequenceIterator results = xexpr.iterate(xdc);
                // FIXME: What if the expression returns a sequence?
                item = results.next();
            } catch (XPathException xe) {
                throw new XProcException(xe);
            }
            //
            //  Good luck!
            //
            // FIXME: Compute effective boolean value in a more robust way
            boolean pass = false;
            if (item instanceof BooleanValue) {
                pass = ((BooleanValueitem).getBooleanValue();
            } else {
                pass = (item != null);
            }
            stillOk = stillOk && pass;
            if (pass && (! || stillOk)) {
                .write(doc);
            } else {
                .write(doc);
            }
        }
    }
New to GrepCode? Check out our FAQ X