Skip to content

Commit b0c5c80

Browse files
committed
Fix #338 don't lose base URI when copying PIs
1 parent 7cdcdd4 commit b0c5c80

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

src/main/java/com/xmlcalabash/util/ProcessMatch.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ private void traverse(XdmNode node) throws SaxonApiException, XPathException {
268268
processor.processPI(node);
269269
saw = 0;
270270
} else {
271-
addPI(node.getNodeName().getLocalName(), node.getStringValue());
271+
addPI(node);
272272
}
273273
} else {
274274
throw new UnsupportedOperationException("Unexpected node type");

src/main/java/com/xmlcalabash/util/TreeWriter.java

+32-23
Original file line numberDiff line numberDiff line change
@@ -139,28 +139,24 @@ public void endDocument() {
139139
}
140140

141141
public void addSubtree(XdmNode node) {
142-
try {
143-
receiver.append(node.getUnderlyingNode());
144-
} catch (UnsupportedOperationException use) {
145-
// Do it the hard way
146-
if (node.getNodeKind() == XdmNodeKind.DOCUMENT) {
147-
writeChildren(node);
148-
} else if (node.getNodeKind() == XdmNodeKind.ELEMENT) {
149-
addStartElement(node);
150-
writeChildren(node);
151-
addEndElement();
152-
} else if (node.getNodeKind() == XdmNodeKind.COMMENT) {
153-
addComment(node.getStringValue());
154-
} else if (node.getNodeKind() == XdmNodeKind.TEXT) {
155-
addText(node.getStringValue());
156-
} else if (node.getNodeKind() == XdmNodeKind.PROCESSING_INSTRUCTION) {
157-
addPI(node.getNodeName().getLocalName(), node.getStringValue());
158-
} else {
159-
throw new UnsupportedOperationException("Unexpected node type");
160-
}
161-
} catch (XPathException xpe) {
162-
throw new XProcException(xpe);
163-
}
142+
// N.B. It's tempting to copy the node with
143+
// receiver.append(node.getUnderlyingNode());
144+
// but that doesn't work: https://saxonica.plan.io/issues/5691
145+
146+
if (node.getNodeKind() == XdmNodeKind.DOCUMENT) {
147+
writeChildren(node);
148+
} else if (node.getNodeKind() == XdmNodeKind.ELEMENT) {
149+
addStartElement(node);
150+
writeChildren(node);
151+
addEndElement();
152+
} else if (node.getNodeKind() == XdmNodeKind.COMMENT) {
153+
addComment(node.getStringValue());
154+
} else if (node.getNodeKind() == XdmNodeKind.TEXT) {
155+
addText(node.getStringValue());
156+
} else if (node.getNodeKind() == XdmNodeKind.PROCESSING_INSTRUCTION) {
157+
addPI(node.getNodeName().getLocalName(), node.getStringValue());
158+
} else {
159+
throw new UnsupportedOperationException("Unexpected node type"); }
164160
}
165161

166162
protected void writeChildren(XdmNode node) {
@@ -336,11 +332,24 @@ public void addText(String text) {
336332
}
337333

338334
public void addPI(String target, String data) {
335+
addPI(target, data, VoidLocation.instance());
336+
}
337+
338+
public void addPI(String target, String data, Location location) {
339339
try {
340-
receiver.processingInstruction(target, data, VoidLocation.instance(), 0);
340+
receiver.processingInstruction(target, data, location, 0);
341341
} catch (XPathException e) {
342342
throw new XProcException(e);
343343
}
344344
}
345+
346+
public void addPI(XdmNode node) {
347+
Location location = VoidLocation.instance();
348+
if (node.getBaseURI() != null) {
349+
location = new SysIdLocation(node.getBaseURI().toString());
350+
receiver.setSystemId(node.getBaseURI().toString());
351+
}
352+
addPI(node.getNodeName().getLocalName(), node.getStringValue(), location);
353+
}
345354
}
346355

0 commit comments

Comments
 (0)