Project

Profile

Help

Support #4618 » Main.java

Norman Tovey-Walsh, 2020-06-28 19:06

 
package com.nwalsh.drivers;

import net.sf.saxon.event.PipelineConfiguration;
import net.sf.saxon.event.Receiver;
import net.sf.saxon.expr.parser.Loc;
import net.sf.saxon.om.EmptyAttributeMap;
import net.sf.saxon.om.FingerprintedQName;
import net.sf.saxon.s9api.Axis;
import net.sf.saxon.s9api.DocumentBuilder;
import net.sf.saxon.s9api.Location;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.XdmDestination;
import net.sf.saxon.s9api.XdmNode;
import net.sf.saxon.s9api.XdmNodeKind;
import net.sf.saxon.s9api.XdmSequenceIterator;
import net.sf.saxon.serialize.SerializationProperties;
import net.sf.saxon.trans.XPathException;
import org.xml.sax.InputSource;

import javax.xml.transform.sax.SAXSource;
import java.io.ByteArrayInputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;

public class Main {
public static void main(String[] argv) throws SaxonApiException {
Processor processor = new Processor(false);
String docString = "<doc><p1/>text<p2 xml:base='http://base.com/'><p4/></p2><p3><p4/></p3></doc>";
DocumentBuilder builder = processor.newDocumentBuilder();
builder.setBaseURI(URI.create("http://foo.com/"));
XdmNode document = builder.build(new SAXSource(new InputSource(new ByteArrayInputStream(docString.getBytes(StandardCharsets.UTF_8)))));

System.err.println("==============");
System.err.println("document:");
dump(document);

XdmSequenceIterator<XdmNode> iter = document.axisIterator(Axis.CHILD);
XdmNode doc = iter.next();
iter = doc.axisIterator(Axis.CHILD);

XdmNode newdoc = null;
XdmDestination destination = new XdmDestination();
PipelineConfiguration pipe = processor.getUnderlyingConfiguration().makePipelineConfiguration();
Receiver receiver = destination.getReceiver(pipe, new SerializationProperties());
try {
//receiver.setSystemId("http://receiver.com/");
receiver.open();
receiver.startDocument(0);

FingerprintedQName wrapper = new FingerprintedQName("", "", "wrapper2");
Location loc = new Loc("http://example.com/", -1, -1);
receiver.startElement(wrapper, doc.getUnderlyingNode().getSchemaType(), EmptyAttributeMap.getInstance(),
doc.getUnderlyingNode().getAllNamespaces(), loc, 0);

loc = new Loc("http://bar.com/", -1, -1);
while (iter.hasNext()) {
XdmNode node = iter.next();
if (node.getNodeKind() == XdmNodeKind.ELEMENT) {
receiver.append(node.getUnderlyingNode(), loc, 0);
} else {
receiver.append(node.getUnderlyingNode(), loc, 0);
}
}

receiver.endElement();
receiver.endDocument();
receiver.close();
newdoc = destination.getXdmNode();
} catch (XPathException e) {
throw new RuntimeException(e);
}

System.err.println("==============");
System.err.println("newdoc:");
dump(newdoc);
}

private static void dump(XdmNode node) {
switch (node.getNodeKind()) {
case ELEMENT:
System.err.println("E:" + node.getNodeName() + ": " + node.getBaseURI());
break;
case TEXT:
System.err.println("T:" + node.getStringValue() + ": " + node.getBaseURI());
break;
default:
break;
}

XdmSequenceIterator<XdmNode> iter = node.axisIterator(Axis.CHILD);
while (iter.hasNext()) {
XdmNode child = iter.next();
dump(child);
}
}
}
(2-2/3)