# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1409842607 -7200
# Node ID b814f45b6beb6695238ca983273ba9ba7fb0bac7
# Parent  96ce967c018210eb12dd006dec5d12d57913c1a1
out-xpath: XPath parameters

diff -r 96ce967c0182 -r b814f45b6beb java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/PropertiesVariableResolver.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/PropertiesVariableResolver.java	Thu Sep 04 16:56:47 2014 +0200
@@ -0,0 +1,41 @@
+/**
+ * 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.Properties;
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPathVariableResolver;
+
+/**
+ *
+ * @author Ing. František Kučera (frantovo.cz)
+ */
+public class PropertiesVariableResolver implements XPathVariableResolver {
+
+	private Properties data;
+
+	public PropertiesVariableResolver(Properties data) {
+		this.data = data;
+	}
+
+	@Override
+	public Object resolveVariable(QName variableName) {
+		return data.getProperty(variableName.getLocalPart());
+	}
+
+}
diff -r 96ce967c0182 -r b814f45b6beb 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	Thu Sep 04 16:28:49 2014 +0200
+++ b/java/alt2xml-out-xpath/src/cz/frantovo/alt2xml/out/xpath/XPathAction.java	Thu Sep 04 16:56:47 2014 +0200
@@ -35,33 +35,39 @@
 
 	private final XPathFactory xpathFactory;
 	private final XPath xpath;
+	private final String expressionString;
+	private final XPathExpression xpathExpression;
 
-	public XPathAction(ActionContext actionContext) {
+	public XPathAction(ActionContext actionContext) throws OutputActionException {
 		super(actionContext);
 		xpathFactory = XPathFactory.newInstance();
 		xpath = xpathFactory.newXPath();
-	}
 
-	@Override
-	public void run(DOMResult domResult) throws OutputActionException {
+		if (!actionContext.getActionProperties().isEmpty()) {
+			xpath.setXPathVariableResolver(new PropertiesVariableResolver(actionContext.getActionProperties()));
+		}
 
 		if (getActionContext().getActionData().size() == 1) {
-			String expressionString = getActionContext().getActionData().get(0);
-
+			expressionString = getActionContext().getActionData().get(0);
 			try {
-				XPathExpression xpe = xpath.compile(expressionString);
-
-				String result = xpe.evaluate(domResult.getNode());
-
-				try (PrintWriter out = new PrintWriter(getActionContext().getOutputStream())) {
-					out.println(result);
-				}
-
+				xpathExpression = xpath.compile(expressionString);
 			} catch (XPathExpressionException e) {
-				throw new OutputActionException("Unable to compile or evaluate XPath: " + expressionString, e);
+				throw new OutputActionException("Unable to compile XPath: " + expressionString, e);
 			}
 		} else {
 			throw new OutputActionException("Please specify the XPath expression as action data");
 		}
 	}
+
+	@Override
+	public void run(DOMResult domResult) throws OutputActionException {
+		try {
+			String result = xpathExpression.evaluate(domResult.getNode());
+			try (PrintWriter out = new PrintWriter(getActionContext().getOutputStream())) {
+				out.println(result);
+			}
+		} catch (XPathExpressionException e) {
+			throw new OutputActionException("Unable to evaluate XPath: " + xpathExpression, e);
+		}
+	}
 }