diff --git a/xml/src/main/java/org/springframework/xml/JaxpVersion.java b/xml/src/main/java/org/springframework/xml/JaxpVersion.java
index 6dcd0c53..171777ea 100644
--- a/xml/src/main/java/org/springframework/xml/JaxpVersion.java
+++ b/xml/src/main/java/org/springframework/xml/JaxpVersion.java
@@ -80,4 +80,27 @@ public abstract class JaxpVersion {
public static int getJaxpVersion() {
return jaxpVersion;
}
-}
\ No newline at end of file
+
+ /**
+ * Convenience method to determine if the current JAXP version is at least 1.3 (packaged with JDK 1.5).
+ *
+ * @return true if the current JAXP version is at least JAXP 1.3
+ * @see #getJaxpVersion()
+ * @see #JAXP_13
+ */
+ public static boolean isAtLeastJaxp13() {
+ return getJaxpVersion() >= JAXP_13;
+ }
+
+ /**
+ * Convenience method to determine if the current JAXP version is at least 1.4 (packaged with JDK 1.6).
+ *
+ * @return true if the current JAXP version is at least JAXP 1.4
+ * @see #getJaxpVersion()
+ * @see #JAXP_14
+ */
+ public static boolean isAtLeastJaxp14() {
+ return getJaxpVersion() >= JAXP_14;
+ }
+
+}
diff --git a/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java b/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java
index f5f6847b..8a8d1759 100644
--- a/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java
+++ b/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java
@@ -21,6 +21,7 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.xml.JaxpVersion;
@@ -42,9 +43,14 @@ public abstract class XPathExpressionFactory {
private static final String JAXEN_CLASS_NAME = "org.jaxen.XPath";
+ private static boolean jaxp13Available;
+
private static boolean jaxenAvailable;
static {
+ // Check whether JAXP 1.3 is available
+ jaxp13Available = JaxpVersion.isAtLeastJaxp13();
+
// Check whether Jaxen is available
try {
ClassUtils.forName(JAXEN_CLASS_NAME);
@@ -81,18 +87,24 @@ public abstract class XPathExpressionFactory {
public static XPathExpression createXPathExpression(String expression, Map namespaces)
throws IllegalStateException, XPathParseException {
Assert.hasLength(expression, "expression is empty");
- if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_13) {
- logger.trace("Creating [javax.xml.xpath.XPathExpression]");
- return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces);
+ if (jaxp13Available) {
+ try {
+ logger.trace("Creating [javax.xml.xpath.XPathExpression]");
+ return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces);
+ }
+ catch (XPathException e) {
+ throw e;
+ }
+ catch (Throwable e) {
+ jaxp13Available = false;
+ }
}
- else if (jaxenAvailable) {
+ if (jaxenAvailable) {
logger.trace("Creating [org.jaxen.XPath]");
return JaxenXPathExpressionFactory.createXPathExpression(expression, namespaces);
}
- else {
- throw new IllegalStateException(
- "Could not create XPathExpression: could not locate JAXP 1.3, or Jaxen on the class path");
- }
+ throw new IllegalStateException(
+ "Could not create XPathExpression: could not locate JAXP 1.3, or Jaxen on the class path");
}