# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1410982278 -7200
# Node ID fd83cd102325c44ecc464058bb7bd244f8d0bd4e
# Parent  b50e77d23d13c72f0c4f739542bde4d038ad3737
out-xpath: support namespace prefixes defined in the input document

diff -r b50e77d23d13 -r fd83cd102325 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/DocumentNamespaceContext.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/DocumentNamespaceContext.java	Wed Sep 17 21:31:18 2014 +0200
@@ -0,0 +1,59 @@
+/**
+ * Alt2XML
+ * Copyright © 2014 František Kučera (frantovo.cz)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package cz.frantovo.alt2xml.out.xpath;
+
+import java.util.Iterator;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class DocumentNamespaceContext implements NamespaceContext {
+
+	private final Node document;
+
+	public DocumentNamespaceContext(Node document) {
+		this.document = document;
+	}
+
+	@Override
+	public String getNamespaceURI(String prefix) {
+		if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
+			return document.lookupNamespaceURI(null);
+		} else {
+			return document.lookupNamespaceURI(prefix);
+		}
+	}
+
+	@Override
+	public String getPrefix(String xmlns) {
+		return document.lookupPrefix(xmlns);
+	}
+
+	/**
+	 * TODO: support multiple prefixes
+	 */
+	@Override
+	public Iterator getPrefixes(String xmlns) {
+		return new OneItemIterator(getPrefix(xmlns));
+	}
+}
diff -r b50e77d23d13 -r fd83cd102325 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/OneItemIterator.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/OneItemIterator.java	Wed Sep 17 21:31:18 2014 +0200
@@ -0,0 +1,49 @@
+/**
+ * Alt2XML
+ * Copyright © 2014 František Kučera (frantovo.cz)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package cz.frantovo.alt2xml.out.xpath;
+
+import java.util.Iterator;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class OneItemIterator<T> implements Iterator<T> {
+
+	private final T item;
+	private boolean unused = true;
+
+	public OneItemIterator(T item) {
+		this.item = item;
+	}
+
+	@Override
+	public boolean hasNext() {
+		return unused;
+	}
+
+	@Override
+	public T next() {
+		return item;
+	}
+
+	@Override
+	public void remove() {
+		throw new UnsupportedOperationException("remove not supported");
+	}
+}
diff -r b50e77d23d13 -r fd83cd102325 java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java
--- a/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java	Wed Sep 17 21:06:56 2014 +0200
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java	Wed Sep 17 21:31:18 2014 +0200
@@ -31,6 +31,7 @@
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 import javax.xml.xpath.XPathVariableResolver;
+import org.w3c.dom.Node;
 
 /**
  *
@@ -47,7 +48,6 @@
 	private final XPathFactory xpathFactory;
 	private final XPath xpath;
 	private final String expressionString;
-	private final XPathExpression xpathExpression;
 
 	public XPathAction(ActionContext actionContext) throws OutputActionException {
 		super(actionContext);
@@ -79,12 +79,6 @@
 			xpath.setXPathVariableResolver(variableResolver);
 
 			expressionString = actionData.get(0);
-			try {
-				xpathExpression = xpath.compile(expressionString);
-			} catch (XPathExpressionException e) {
-				throw new OutputActionException("Unable to compile XPath: " + expressionString, e);
-			}
-
 		}
 	}
 
@@ -147,8 +141,19 @@
 
 	@Override
 	public void run(DOMResult domResult) throws OutputActionException {
+		XPathExpression xpathExpression = null;
 		try {
-			String result = xpathExpression.evaluate(domResult.getNode());
+			Node document = domResult.getNode();
+
+			xpath.setNamespaceContext(new DocumentNamespaceContext(document));
+
+			try {
+				xpathExpression = xpath.compile(expressionString);
+			} catch (XPathExpressionException e) {
+				throw new OutputActionException("Unable to compile XPath: " + expressionString, e);
+			}
+
+			String result = xpathExpression.evaluate(document);
 			try (PrintWriter out = new PrintWriter(getActionContext().getOutputStream())) {
 				out.print(result);
 				if (lineBreak) {