This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch release
in repository https://gitbox.apache.org/repos/asf/commons-jxpath.git


The following commit(s) were added to refs/heads/release by this push:
     new 3602b3c  Merge from master
3602b3c is described below

commit 3602b3cc44fbed1227c87e5b579b2e86dc2d5b21
Author: Gary D. Gregory <garydgreg...@gmail.com>
AuthorDate: Sun Apr 13 13:01:06 2025 -0400

    Merge from master
---
 pom.xml                                            |   2 +-
 .../org/apache/commons/jxpath/JXPathContext.java   |  71 ++-
 .../users-guide.xml => main/javadoc/overview.html} | 486 +++++++++++----------
 .../resources/images/{logo.jpg => logo-blue.jpg}   | Bin
 src/site/resources/images/logo-wbg.jpg             | Bin 7020 -> 0 bytes
 src/site/resources/images/logo.jpg                 | Bin 5727 -> 7020 bytes
 src/site/site.xml                                  |  62 ++-
 src/site/xdoc/contributors.xml                     |   1 +
 src/site/xdoc/index.xml                            |   2 +-
 9 files changed, 343 insertions(+), 281 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2477bbe..b62fbd1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
     <commons.release.version>1.4.0</commons.release.version>
     <commons.release.next>1.4.1</commons.release.next>
     <commons.release.isDistModule>true</commons.release.isDistModule>
-    <commons.rc.version>RC1</commons.rc.version>
+    <commons.rc.version>RC2</commons.rc.version>
     <commons.bc.version>1.3</commons.bc.version>
     <commons.release.desc>(Java 8 or above)</commons.release.desc>
     <commons.jira.id>JXPATH</commons.jira.id>
diff --git a/src/main/java/org/apache/commons/jxpath/JXPathContext.java 
b/src/main/java/org/apache/commons/jxpath/JXPathContext.java
index 5f19744..e1f1c29 100644
--- a/src/main/java/org/apache/commons/jxpath/JXPathContext.java
+++ b/src/main/java/org/apache/commons/jxpath/JXPathContext.java
@@ -91,7 +91,10 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * Address addr = (Address) context.getValue("homeAddress");
  * </pre>
  *
- * <h3>Example 3: Collection Subscripts</h3> JXPath can extract elements from 
arrays and collections.
+ * <h3>Example 3: Collection Subscripts</h3>
+ * <p>
+ * JXPath can extract elements from arrays and collections.
+ * </p>
  *
  * <pre>
  * public class Integers {
@@ -109,7 +112,8 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  *
  * A collection can be an arbitrary array or an instance of java.util. 
Collection.
  * <p>
- * Note: in XPath the first element of a collection has index 1, not 0.<br>
+ * Note: in XPath the first element of a collection has index 1, not 0.
+ * </p>
  *
  * <h3>Example 4: Map Element Access</h3>
  *
@@ -136,7 +140,9 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * String homeZipCode = (String)context.getValue("addresses/home/zipCode");
  * </pre>
  *
+ * <p>
  * Often you will need to use the alternative syntax for accessing Map 
elements:
+ * </p>
  *
  * <pre>
  *
@@ -192,9 +198,12 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  *
  * </pre>
  *
- * <h3>Example 7: Creating objects</h3> JXPath can be used to create new 
objects. First, create a subclass of {@link AbstractFactory AbstractFactory} and
+ * <h3>Example 7: Creating objects</h3>
+ * <p>
+ * JXPath can be used to create new objects. First, create a subclass of 
{@link AbstractFactory AbstractFactory} and
  * install it on the JXPathContext. Then call {@link JXPathContext#createPath 
createPathAndSetValue()} instead of "setValue". JXPathContext will invoke your
  * AbstractFactory when it discovers that an intermediate node of the path is 
<strong>null</strong>. It will not override existing nodes.
+ * </p>
  *
  * <pre>
  * public class AddressFactory extends AbstractFactory {
@@ -213,7 +222,10 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * context.createPathAndSetValue("address/zipCode", "90190");
  * </pre>
  *
- * <h3>Example 8: Using Variables</h3> JXPath supports the notion of 
variables. The XPath syntax for accessing variables is <em>"$varName"</em>.
+ * <h3>Example 8: Using Variables</h3>
+ * <p>
+ * JXPath supports the notion of variables. The XPath syntax for accessing 
variables is <em>"$varName"</em>.
+ * </p>
  *
  * <pre>
  * public class Author {
@@ -231,16 +243,21 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * Book secondBook = (Book)context.getValue("books[$index]");
  * </pre>
  *
+ * <p>
  * You can also set variables using JXPath:
+ * </p>
  *
  * <pre>
  * context.setValue("$index", Integer.valueOf(3));
  * </pre>
  *
+ * <p>
  * Note: you can only <em>change</em> the value of an existing variable this 
way, you cannot <em>define</em> a new variable.
+ * </p>
  *
  * <p>
  * When a variable contains a JavaBean or a collection, you can traverse the 
bean or collection as well:
+ * </p>
  *
  * <pre>
  * ...
@@ -254,8 +271,11 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * String title = (String)context.getValue("$books[2]/title);
  * </pre>
  *
- * <h3>Example 9: Using Nested Contexts</h3> If you need to use the same set 
of variable while interpreting XPaths with different beans, it makes sense to 
put
+ * <h3>Example 9: Using Nested Contexts</h3>
+ * <p>
+ * If you need to use the same set of variable while interpreting XPaths with 
different beans, it makes sense to put
  * the variables in a separate context and specify that context as a parent 
context every time you allocate a new JXPathContext for a JavaBean.
+ * </p>
  *
  * <pre>
  * JXPathContext varContext = JXPathContext.newContext(null);
@@ -264,40 +284,54 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * Iterator javaBooks = context.iterate("books[title = $title]");
  * </pre>
  *
- * <h3>Using Custom Variable Pools</h3> By default, JXPathContext creates a 
HashMap of variables. However, you can substitute a custom implementation of the
+ * <h3>Using Custom Variable Pools</h3>
+ * <p>
+ * By default, JXPathContext creates a HashMap of variables. However, you can 
substitute a custom implementation of the
  * Variables interface to make JXPath work with an alternative source of 
variables. For example, you can define implementations of Variables that cover a
  * servlet context, HTTP request or any similar structure.
+ * </p>
  *
  * <h3>Example 10: Using Standard Extension Functions</h3> Using the standard 
extension functions, you can call methods on objects, static methods on classes
  * and create objects using any constructor. The class names should be fully 
qualified.
  * <p>
  * Here's how you can create new objects:
+ * </p>
  *
  * <pre>
  *
  * Book book = (Book) 
context.getValue("org.apache.commons.jxpath.example.Book.new ('John Updike')");
  * </pre>
  *
+ * <p>
  * Here's how you can call static methods:
+ * </p>
  *
  * <pre>
  *
  * Book book = (Book) context.getValue("org. 
apache.commons.jxpath.example.Book.getBestBook('John Updike')");
  * </pre>
  *
+ * <p>
  * Here's how you can call regular methods:
+ * </p>
  *
  * <pre>
  *
  * String firstName = (String) context.getValue("getAuthorsFirstName($book)");
  * </pre>
  *
+ * <p>
  * As you can see, the target of the method is specified as the first 
parameter of the function.
+ * </p>
  *
- * <h3>Example 11: Using Custom Extension Functions</h3> Collections of custom 
extension functions can be implemented as {@link Functions Functions} objects or
+ * <h3>Example 11: Using Custom Extension Functions</h3>
+ * <p>
+ * Collections of custom extension functions can be implemented as {@link 
Functions Functions} objects or
  * as Java classes, whose methods become extenstion functions.
+ * </p>
  * <p>
  * Let's say the following class implements various formatting operations:
+ * </p>
  *
  * <pre>
  * public class Formats {
@@ -308,7 +342,9 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * }
  * </pre>
  *
+ * <p>
  * We can register this class with a JXPathContext:
+ * </p>
  *
  * <pre>
  * context.setFunctions(new ClassFunctions(Formats.class, "format"));
@@ -319,20 +355,25 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  *
  * </pre>
  *
+ * <p>
  * You can also register whole packages of Java classes using PackageFunctions.
+ * </p>
  * <p>
  * Also, see {@link FunctionLibrary FunctionLibrary}, which is a class that 
allows you to register multiple sets of extension functions with the same
  * JXPathContext.
+ * </p>
  *
  * <h2>Configuring JXPath</h2>
  *
+ * <p>
  * JXPath uses JavaBeans introspection to discover properties of JavaBeans. 
You can provide alternative property lists by supplying custom JXPathBeanInfo
  * classes (see {@link JXPathBeanInfo JXPathBeanInfo}).
+ * </p>
  *
  * <h2>Notes</h2>
  * <ul>
  * <li>JXPath does not support DOM attributes for non-DOM objects. Even though 
XPaths like "para[@type='warning']" are legitimate, they will always produce
- * empty results. The only attribute supported for JavaBeans is "name". The 
XPath "foo/bar" is equivalent to "foo[@name='bar']".
+ * empty results. The only attribute supported for JavaBeans is "name". The 
XPath "foo/bar" is equivalent to "foo[@name='bar']".</li>
  *
  * <li id='matches_no_property_in_the_graph'>The term <b>matches no property 
in the graph</b> is used throughout the documentation. It describes a property 
or
  * path that can be determined as not belonging to the graph. Determining 
whether a property or path belongs to the graph depends on the type of object 
being
@@ -351,11 +392,17 @@ import org.apache.commons.jxpath.util.KeyManagerUtils;
  * </li>
  * </ul>
  *
- * See <a href="http://www.w3schools.com/xpath";>XPath Tutorial by 
W3Schools</a><br>
- * . Also see <a href="http://www.w3.org/TR/xpath";>XML Path Language (XPath) 
Version 1.0</a><br>
- * <br>
+ * <p>
+ * See also:
+ * </p>
+ * <ul>
+ * <li>See <a href="http://www.w3schools.com/xpath";>XPath Tutorial by 
W3Schools</a></li>
+ * <li>See also <a href="http://www.w3.org/TR/xpath";>XML Path Language (XPath) 
Version 1.0</a></li>
+ * </ul>
  *
- * You will also find more information and examples in <a 
href="https://commons.apache.org/jxpath/users-guide.html";> JXPath User's 
Guide</a>
+ * <p>
+ * You will also find more information and examples in the <a 
href="https://commons.apache.org/proper/jxpath/apidocs/index.html";>JXPath 
User's Guide</a>
+ * </p>
  */
 public abstract class JXPathContext {
 
diff --git a/src/site/xdoc/users-guide.xml b/src/main/javadoc/overview.html
similarity index 87%
rename from src/site/xdoc/users-guide.xml
rename to src/main/javadoc/overview.html
index 49d0003..1364664 100644
--- a/src/site/xdoc/users-guide.xml
+++ b/src/main/javadoc/overview.html
@@ -15,18 +15,10 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<document>
-  <properties>
-    <title>
-       JXPath User's Guide
-    </title>
-    <author email="dmi...@apache.org">
-       Dmitri Plotnikov
-    </author>
-  </properties>
-
-  <body>
-    <section name="What's JXPath">
+<html>
+<body>
+    <section>
+      <h1>What's JXPath</h1>
       <p>
         JXPath provides APIs for traversal of graphs of JavaBeans,
         DOM and other types of objects using the XPath syntax.
@@ -34,8 +26,9 @@
       <p>
         If you are not familiar with the XPath syntax, start with
         <a href="http://www.w3schools.com/xpath";>XPath Tutorial by 
W3Schools</a>.
-        <br/>
-         Also see
+      </p>
+      <p>
+        See also
         <a href="http://www.w3.org/TR/xpath";>XML Path Language (XPath) Version 
1.0</a> -
         that's the official standard.
       </p>
@@ -163,8 +156,8 @@
       </ul>
     </section>
 
-
-    <section name="Object Graph Traversal">
+    <section>
+      <h1>Object Graph Traversal</h1>
       <p>
         JXPath uses JavaBeans introspection to enumerate and access
         JavaBeans properties.
@@ -179,14 +172,15 @@
       </p>
 
 
-      <subsection name="JavaBean Property Access">
+      <section>
+        <h2>JavaBean Property Access</h2>
         <p>
           JXPath can be used to access properties of a JavaBean.
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 public class Employee {
     public String getFirstName(){
        ...
@@ -198,7 +192,7 @@ Employee emp = new Employee();
 
 JXPathContext context = JXPathContext.newContext(emp);
 String fName = (String)context.getValue("firstName");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -212,10 +206,11 @@ String fName = (String)context.getValue("firstName");
           <code>"firstName"</code> would produce the same result, because the 
           <code>"child::"</code> and <code>"attribute::"</code> axes are 
equivalent.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Lenient Mode">
+      <section>
+        <h2>Lenient Mode</h2>
         <p>
           The <code>context.getValue(xpath)</code>  method throws
           an exception if the supplied XPath does not map to an
@@ -224,17 +219,18 @@ String fName = (String)context.getValue("firstName");
           lenient mode the method merely returns null if the path
           maps to nothing.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Nested Bean Property Access">
+      <section>
+        <h2>Nested Bean Property Access</h2>
         <p>
           JXPath can traverse object graphs:
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Employee {
     public Address getHomeAddress(){
        ...
@@ -251,7 +247,7 @@ String fName = (String)context.getValue("firstName");
 
  JXPathContext context = JXPathContext.newContext(emp);
  String sNumber = (String)context.getValue("homeAddress/streetNumber");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -265,23 +261,24 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
     Address addr = (Address)context.getValue("homeAddress");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
-      </subsection>
+      </section>
 
 
-      <subsection name="Collection Subscripts">
+      <section>
+        <h2>Collection Subscripts</h2>
         <p>
           JXPath can extract elements from arrays and collections.
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Integers {
     public int[] getNumbers(){
        ...
@@ -293,7 +290,7 @@ String fName = (String)context.getValue("firstName");
 
  JXPathContext context = JXPathContext.newContext(ints);
  Integer thirdInt = (Integer)context.getValue("numbers[3]");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -303,12 +300,12 @@ String fName = (String)context.getValue("firstName");
         </p>
         <p><b>Note:</b>  in XPath the first element of a collection has
           index 1, not 0.
-          <br/>
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Retrieving Multiple Results">
+      <section>
+        <h2>Retrieving Multiple Results</h2>
         <p>
           JXPath can retrieve multiple objects from a graph. Note
           that the method called in this case is not <code>getValue</code>,
@@ -316,8 +313,8 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Author {
     public Book[] getBooks(){
        ...
@@ -329,25 +326,26 @@ String fName = (String)context.getValue("firstName");
 
  JXPathContext context = JXPathContext.newContext(auth);
  Iterator threeBooks = context.iterate("books[position() &lt; 4]");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
           This returns an iterator over at most three books from the array
           of all books written by the author.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Map Element Access">
+      <section>
+        <h2>Map Element Access</h2>
         <p>
           JXPath supports maps. To get a value use its key as the name in 
           a <code>child::name</code> construct.
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Employee {
     private Map addressMap = new HashMap();
     {
@@ -365,7 +363,7 @@ String fName = (String)context.getValue("firstName");
  JXPathContext context = JXPathContext.newContext(emp);
  String homeZipCode =
         (String)context.getValue("addresses/home/zipCode");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -374,11 +372,11 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  String homeZipCode = (String)context.
         getValue("addresses[@name='home']/zipCode");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -405,16 +403,18 @@ String fName = (String)context.getValue("firstName");
           <a 
href="apidocs/org/apache/commons/jxpath/JXPathIntrospector.html"><code>JXPathIntrospector</code></a>.
           The term JXPath uses for such objects is "objects with Dynamic 
Properties".
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="DynaBean Access">
+      <section>
+        <h2>DynaBean Access</h2>
         <p>
           JXPath supports <a 
href="http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/DynaBean.html";>DynaBeans</a>
 
           as well. DynaBeans are treated exactly the same way as JavaBeans.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="DOM/JDOM Document Access">
+      <section>
+        <h2>DOM/JDOM Document Access</h2>
         <p>
           JXPath supports access to DOM and JDOM Nodes. The DOM/JDOM node can 
be
           the context node of JXPathContext or it can be a value of a
@@ -428,9 +428,10 @@ String fName = (String)context.getValue("firstName");
           The intepretation of XPath over DOM/JDOM structures is
           implemented in accordance with the XPath specification.
         </p>        
-      </subsection>
+      </section>
 
-      <subsection name="Getting a Value vs. Selecting a Node">
+      <section>
+        <h2>Getting a Value vs. Selecting a Node</h2>
         <p>
           JXPathContext has two similar sets of APIs: 
           <code>getValue(xpath)/iterate(xpath)</code> and
@@ -446,12 +447,12 @@ String fName = (String)context.getValue("firstName");
           Consider the following XML document:
         </p>
 <!--============================ + SOURCE + ============================-->
-<source>
+<pre><code>
     &lt;?xml version="1.0" ?&gt;
     &lt;address&gt;
       &lt;street&gt;Orchard Road&lt;/street&gt;
     &lt;/address&gt;
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -462,9 +463,10 @@ String fName = (String)context.getValue("firstName");
           type of parser used). The returned <code>Element</code> is, of 
course,
           <code>&lt;street&gt;Orchard Road&lt;/street&gt;</code>.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="Registering Namespaces">
+      <section>
+        <h2>Registering Namespaces</h2>
         <p>
           When using namespaces, it is important to remember that XPath 
matches 
           qualified names (QNames) based on the namespace URI, not on the 
prefix. 
@@ -481,12 +483,13 @@ String fName = (String)context.getValue("firstName");
           known to JXPathContext. JXPathContext knows about namespace prefixes
           declared on the document element of the context node (the one passed
           to <code>JXPathContext.newContext(node)</code>), as well as the ones 
-          explicitly registered using the <a 
href="apidocs/org/apache/commons/jxpath/JXPathContext.html#registerNamespace(java.lang.String,
 java.lang.String)">
+          explicitly registered using the <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/JXPathContext.html#registerNamespace(java.lang.String,java.lang.String)">
           <code>JXPathContext.registerNamespace(prefix, 
namespaceURI)</code></a> method.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="Containers">
+      <section>
+        <h2>Containers</h2>
         <p>
           A <a 
href="apidocs/org/apache/commons/jxpath/Container.html">Container</a>
           is an object implementing an indirection mechanism
@@ -500,7 +503,7 @@ String fName = (String)context.getValue("firstName");
         </p>
         <p>
           An example of a useful container is
-          <a 
href="apidocs/org/apache/commons/jxpath/XMLDocumentContainer.html">XMLDocumentContainer</a>.
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/XMLDocumentContainer.html";>XMLDocumentContainer</a>.
           When you create an XMLDocumentContainer, you give it a
           pointer to an XML file (a <code>URL</code>  or a
           <code>javax.xml.transform.Source</code>). It will read
@@ -518,8 +521,8 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
     &lt;?xml version="1.0" ?&gt;
     &lt;vendor&gt;
       &lt;location id="store101"&gt;
@@ -534,7 +537,7 @@ String fName = (String)context.getValue("firstName");
         &lt;/address&gt;
       &lt;/location&gt;
     &lt;/vendor&gt;
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -542,8 +545,8 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  class Company {
     private Container locations = null;
 
@@ -560,7 +563,7 @@ String fName = (String)context.getValue("firstName");
  ...
  String street = (String)context.getValue(
                 "locations/vendor/location[@id = 'store102']//street");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -568,9 +571,10 @@ String fName = (String)context.getValue("firstName");
           and parse the XML file and find a value in it according to
           the XPath.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="Functions id() and key()">
+      <section>
+        <h2>Functions id() and key()</h2>
         <p>
           Functions <code>id()</code> and <code>key()</code> can be
           used with JXPath, however most of the time that requires custom
@@ -586,19 +590,20 @@ String fName = (String)context.getValue("firstName");
           In order to evaluate the <code>id()</code> function, JXPath
           calls a delegate object that should be implemented and installed
           on the JXPathContext.  The object should implement the
-          <a 
href="apidocs/org/apache/commons/jxpath/IdentityManager.html">IdentityManager</a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/IdentityManager.html";>IdentityManager</a>
           interface.
         </p>
         <p>
           Similarly, the <code>key()</code> function relies on a custom
           implementation of the
-          <a 
href="apidocs/org/apache/commons/jxpath/KeyManager.html">KeyManager</a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/KeyManager.html";>KeyManager</a>
           interface.
         </p>
-      </subsection>
+      </section>
     </section>
 
-    <section name="XPath Axes And Object Graphs">
+    <section>
+      <h1>XPath Axes And Object Graphs</h1>
       <p>
         The interpretation of XPath over XML models like DOM and JDOM is 
governed by
         the XPath standard.  There is no official standard for the 
interpretation
@@ -606,7 +611,8 @@ String fName = (String)context.getValue("firstName");
         This part describes how JXPath performs such interpretation.
       </p>
 
-      <subsection name="Parent/child Relationship">
+      <section>
+        <h2>Parent/child Relationship</h2>
         <p>
           In DOM/JDOM the definition of a node's parent is clear: a Node always
           points to its parent. XML is a strict tree, so there always exactly
@@ -652,6 +658,7 @@ String fName = (String)context.getValue("firstName");
         </p>
         <p>
           <b>Solution:</b>
+        </p>
           <ol>
             <li>
               Descend from the root of the graph looking for a node
@@ -673,15 +680,15 @@ String fName = (String)context.getValue("firstName");
               include the current "foo" node in the result set.
             </li>
           </ol>
-        </p>
         <p>
           The dynamic interpretation of the parent/child relationship affects
           most axes including "parent::", "ancestor::",
           "preceding::", "following::" etc.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="Document Order">
+      <section>
+        <h2>Document Order</h2>
         <p>
           The XPath standard defines the term "document order" as the order
           in which pieces of XML follow each other in the textual 
representation.
@@ -693,9 +700,10 @@ String fName = (String)context.getValue("firstName");
           as JavaBeans or Maps.  In order to have a predictable order,
           JXPath sorts properties of beans and keys of maps alphabetically.
         </p>
-      </subsection>
+      </section>
 
-      <subsection name="Attributes">
+      <section>
+        <h2>Attributes</h2>
         <p>
           For JavaBeans and Maps the "attribute::" axis is interpreted
           the same as the "child::" axis.
@@ -736,11 +744,11 @@ String fName = (String)context.getValue("firstName");
           from it.  This interpretation is used for maps and beans only.
           In the case of XML, "name" is treated like any other attribute.
         </p>
-      </subsection>
-
+      </section>
     </section>
 
-    <section name="Exceptions During XPath Evaluation">
+    <section>
+      <h1>Exceptions During XPath Evaluation</h1>
       <p>
         Exceptions thrown by accessor methods are treated differently depending
         on the evaluated XPath and the particular method used to do the
@@ -760,7 +768,8 @@ String fName = (String)context.getValue("firstName");
       </p>
     </section>
 
-    <section name="Modifying Object Graphs">
+    <section>
+      <h1>Modifying Object Graphs</h1>
       <p>
         JXPath can also be used to modify parts of object graphs:
         property values, values for keys in Maps. It can in some cases
@@ -768,14 +777,15 @@ String fName = (String)context.getValue("firstName");
       </p>
 
 
-      <subsection name="Setting Properties">
+      <section>
+        <h2>Setting Properties</h2>
         <p>
           JXPath can be used to modify property values.
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Employee {
     public Address getAddress() {
        ...
@@ -793,17 +803,18 @@ String fName = (String)context.getValue("firstName");
  JXPathContext context = JXPathContext.newContext(emp);
  context.setValue("address", addr);
  context.setValue("address/zipCode", "90190");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
-      </subsection>
+      </section>
 
 
-      <subsection name="Creating Objects">
+      <section>
+        <h2>Creating Objects</h2>
         <p>
           JXPath can be used to create new objects. First, create a
           subclass of
-          <a 
href="apidocs/org/apache/commons/jxpath/AbstractFactory.html"><code>AbstractFactory</code></a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/AbstractFactory.html";><code>AbstractFactory</code></a>
           and install it on the JXPathContext. Then call
           <code>jxPathContext.createPath(xpath)</code>.
           JXPathContext will invoke your AbstractFactory when it
@@ -812,8 +823,8 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class AddressFactory extends AbstractFactory {
     public boolean createObject(JXPathContext context, Pointer pointer,
                                 Object parent, String name, int index){
@@ -828,7 +839,7 @@ String fName = (String)context.getValue("firstName");
  JXPathContext context = JXPathContext.newContext(emp);
  context.setFactory(new AddressFactory());
  context.createPath("address");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -838,10 +849,10 @@ String fName = (String)context.getValue("firstName");
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  context.createPathAndSetValue("address/zipCode", "90190");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -849,6 +860,7 @@ String fName = (String)context.getValue("firstName");
           nodes with very simple paths. In fact, JXPath will not
           attempt to create intermediate nodes for paths that don't
           follow these three rules:
+        </p>
           <ul>
             <li>
               The only axes used are "child::" and "attribute::", e.g.
@@ -865,20 +877,20 @@ String fName = (String)context.getValue("firstName");
               e.g. <code>"$object/child"</code>.
             </li>
           </ul>
-        </p>
-      </subsection>
+      </section>
     </section>
 
 
-    <section name="Variables">
+    <section>
+      <h1>Variables</h1>
       <p>
         JXPath supports the notion of variables. The XPath syntax for
         accessing variables is <i>"$varName"</i>.
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Author {
     public Book[] getBooks(){
        ...
@@ -892,7 +904,7 @@ String fName = (String)context.getValue("firstName");
  context.getVariables().declareVariable("index", new Integer(2));
 
  Book secondBook = (Book)context.getValue("books[$index]");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
@@ -900,10 +912,10 @@ String fName = (String)context.getValue("firstName");
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  context.setValue("$index", new Integer(3));
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p><b>Note:</b>  generally speaking, you can only <i>change</i>  the
@@ -921,8 +933,8 @@ String fName = (String)context.getValue("firstName");
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  ...
  context.getVariables().declareVariable("book", myBook);
  String title = (String)context.getValue("$book/title);
@@ -932,13 +944,11 @@ String fName = (String)context.getValue("firstName");
  context.getVariables().declareVariable("books", array);
 
  String title = (String)context.getValue("$books[2]/title);
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
-      <p/>
-
-
-      <subsection name="Custom Variable Pools">
+      <section>
+        <h2>Custom Variable Pools</h2>
         <p>
           By default, JXPathContext creates a HashMap of variables.
           However, you can substitute a custom implementation of the
@@ -949,13 +959,14 @@ String fName = (String)context.getValue("firstName");
         </p>
         <p>
           See the
-          <a 
href="apidocs/org/apache/commons/jxpath/servlet/package-summary.html">org.apache.commons.jxpath.servlet</a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/servlet/package-summary.html";>org.apache.commons.jxpath.servlet</a>
           package for an example of just that.
         </p>
-      </subsection>
+      </section>
     </section>
 
-    <section name="Servlet Contexts">
+    <section>
+      <h1>Servlet Contexts</h1>
       <p>
         The <code>org.apache.commons.jxpath.servlet</code>  package
         contains classes that make it easy to use XPath to access
@@ -964,12 +975,13 @@ String fName = (String)context.getValue("firstName");
       </p>
       <p>
         See static methods of the class
-        <a 
href="apidocs/org/apache/commons/jxpath/servlet/JXPathServletContexts.html"><code>JXPathServletContexts</code></a>.
+        <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/servlet/JXPathServletContexts.html";><code>JXPathServletContexts</code></a>.
         They allocate various servlet-related JXPathContexts.
       </p>
 
 
-      <subsection name="JSP Page Context">
+      <section>
+        <h2>JSP Page Context</h2>
         <p>
           The JXPathContext returned by
           <code>getPageContext(PageContext pageContext)</code>
@@ -989,10 +1001,11 @@ String fName = (String)context.getValue("firstName");
           expression <code>"$session/foo"</code>  extracts the
           value of the <i>session</i>  attribute named <code>"foo"</code>.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Servlet Request Context">
+      <section>
+        <h2>Servlet Request Context</h2>
         <p>
           The
           <code>getRequestContext(ServletRequest request, ServletContext 
servletContext)</code>
@@ -1000,27 +1013,29 @@ String fName = (String)context.getValue("firstName");
           scope first, then (if there is a session) the session
           context, then the application context.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="HttpSession Context">
+      <section>
+        <h2>HttpSession Context</h2>
         <p>
           The
           <code>getSessionContext(HttpSession session, ServletContext 
servletContext)</code>
           method will give you a context that checks the session
           context, then the application context.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="ServletContext Context">
+      <section>
+        <h2>ServletContext Context</h2>
         <p>
           Finally,
           <code>getApplicationContext(ServletContext servletContext)</code>
           method will give you a context that checks the application
           context.
         </p>
-      </subsection>
+      </section>
       <p>
         All these methods cache the JXPathContexts they create within
         the corresponding scopes. Subsequent calls use the
@@ -1029,7 +1044,8 @@ String fName = (String)context.getValue("firstName");
     </section>
 
 
-    <section name="Pointers">
+    <section>
+      <h1>Pointers</h1>
       <p>
         Often, rather than getting a node in the object graph, you need to 
         find out where in the graph that node is.  In such situations you
@@ -1042,11 +1058,11 @@ String fName = (String)context.getValue("firstName");
         <code>getPointer()</code> method:
       </p>
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 Pointer ptr = context.getPointer("//address[zipCode='90190']")
 System.out.println(ptr);
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
        <p>
@@ -1062,10 +1078,10 @@ System.out.println(ptr);
        </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 Pointer ptr = context.getPointer("employees[$i]/addresses[$j]")
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
@@ -1082,10 +1098,10 @@ Pointer ptr = 
context.getPointer("employees[$i]/addresses[$j]")
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home']");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
@@ -1102,7 +1118,8 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
       </p>
     </section>
 
-    <section name="Relative Contexts">
+    <section>
+      <h1>Relative Contexts</h1>
       <p>
         If you need to evaluate multiple paths relative to a certain node
         in the object graph, you might want to create a relative JXPathContext.
@@ -1114,8 +1131,8 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  JXPathContext context = JXPathContext.newContext(bean);
 
  Pointer addressPtr = context.getPointer("/employees[1]/addresses[2]");
@@ -1132,12 +1149,13 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
  // Use the parent axis to locate the employee for the current address
  Double salary = (Double)relativeContext.getValue("../salary");
 
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
     </section>
 
-    <section name="Extension Functions">
+    <section>
+      <h1>Extension Functions</h1>
       <p>
         JXPath supports standard XPath functions right out of the box.
         It also supports "standard" extension functions, which are
@@ -1146,7 +1164,8 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
       </p>
 
 
-      <subsection name="Standard Extension Functions">
+      <section>
+        <h2>Standard Extension Functions</h2>
         <p>
           Using the standard extension functions, you can call
           methods on objects, static methods on classes and create
@@ -1158,11 +1177,11 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  Book book = (Book)context.
    getValue("com.myco.books.Book.new('John Updike')");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1170,11 +1189,11 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  Book book = (Book)context.
    getValue("com.myco.books.Book.getBestBook('John Updike')");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1182,25 +1201,26 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  String firstName = (String)context.
    getValue("getAuthorsFirstName($book)");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
           As you can see, the target of the method is specified as
           the first parameter of the function.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Custom Extension Functions">
+      <section>
+        <h2>Custom Extension Functions</h2>
         <p>
           Collections of custom extension functions can be
           implemented as
-          <a 
href="apidocs/org/apache/commons/jxpath/Functions.html"><code>Functions</code></a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/Functions.html";><code>Functions</code></a>
           objects or as Java classes, whose methods become extension
           functions.
         </p>
@@ -1210,15 +1230,15 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  public class Formats {
     public static String date(Date d, String pattern){
         return new SimpleDateFormat(pattern).format(d);
     }
     ...
  }
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1226,15 +1246,15 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  context.setFunctions(new ClassFunctions(Formats.class, "format"));
  ...
 
  context.getVariables().declareVariable("today", new Date());
  String today =
      (String)context.getValue("format:date($today, 'MM/dd/yyyy')");
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1243,19 +1263,20 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
         <p>
           Also, see
-          <a 
href="apidocs/org/apache/commons/jxpath/FunctionLibrary.html"><code>FunctionLibrary</code></a>,
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/FunctionLibrary.html";><code>FunctionLibrary</code></a>,
           which is a class that allows you to register multiple sets
           of extension functions with the same JXPathContext.
         </p>
-      </subsection>
+      </section>
 
 
-      <subsection name="Expression Context">
+      <section>
+        <h2>Expression Context</h2>
         <p>
           A custom function can get access to the context in which it
           is being evaluated. ClassFunctions and PackageFunctions
           have special support for methods and constructors that have
-          <a 
href="apidocs/org/apache/commons/jxpath/ExpressionContext.html"><code>ExpressionContext</code></a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/ExpressionContext.html";><code>ExpressionContext</code></a>
           as the first argument. When such an extension function is
           invoked, it is passed an object that implements the
           ExpressionContext interface. The function can then gain
@@ -1264,8 +1285,8 @@ Iterator homeAddresses = 
context.iteratePointers("//employee/address[@name='home
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 public class MyExtensionFunctions {
    public static boolean isDate(ExpressionContext context){
       Pointer pointer = context.getContextNodePointer();
@@ -1276,7 +1297,7 @@ public class MyExtensionFunctions {
    }
    ...
 }
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1285,22 +1306,23 @@ public class MyExtensionFunctions {
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
   "//.[myext:isDate()]"
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
           This expression will find all nodes of the graph that are
           dates.
         </p>
-      </subsection>
+      </section>
       
-      <subsection name="Collections as Arguments">
+      <section>
+        <h2>Collections as Arguments</h2>
         <p>
          There are two ways a collection can be passed to an extension 
function:
-         as a <a 
href="apidocs/org/apache/commons/jxpath/NodeSet.html"><code>NodeSet</code></a>
+         as a <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/NodeSet.html";><code>NodeSet</code></a>
          or as a Collection proper.  If the argument type is declared
          as NodeSet, JXPath will pass a NodeSet object, otherwise it will take 
values
          out of the node set and pass those to the function as a regular 
collection.
@@ -1311,8 +1333,8 @@ public class MyExtensionFunctions {
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
 public class MyExtensionFunctions {
    ...
    public static boolean contains(NodeSet nodeSet, Object value){
@@ -1338,7 +1360,7 @@ public class MyExtensionFunctions {
       return false;
    }
 }
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1347,10 +1369,10 @@ public class MyExtensionFunctions {
         </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
   "/addressBook/contact[myext:contains(phoneNumbers, '555-5555']"
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
         <p>
@@ -1365,26 +1387,29 @@ public class MyExtensionFunctions {
          (org.apache.commons.jxpath.util.JXPath11CompatibleTypeConverter),
          has been provided in version 1.3. To enable this:
         </p>
-<source>
+<pre><code>
 TypeUtils.setTypeConverter(new JXPath11CompatibleTypeConverter());
-</source>
-      </subsection>
-      <subsection name="Collection as the Return Value">
+</code></pre>
+      </section>
+      <section>
+        <h2>Collection as the Return Value</h2>
         <p>
          A custom function can return a collection of arbitrary objects or a 
NodeSet.
          The simple implementation of NodeSet, 
-         <a 
href="apidocs/org/apache/commons/jxpath/BasicNodeSet.html#setLocale">BasicNodeSet</a>,
+         <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/BasicNodeSet.html#setLocale";>BasicNodeSet</a>,
          may come in handy.
         </p>
-      </subsection>
+      </section>
     </section>
 
 
-    <section name="Type Conversions">
+    <section>
+      <h1>Type Conversions</h1>
       <p>
         JXPath automatically performs the following type conversions:
       </p>
       <table>
+        <caption>Type Conversions</caption>
         <tr>
           <th>
             From type
@@ -1503,10 +1528,7 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
           <td><i>any</i>
           </td>
           <td>
-            Takes the first element of the array
-            <br/>
-             and (recursively) converts it to the needed
-            type
+            Takes the first element of the array and (recursively) converts it 
to the needed type
           </td>
         </tr>
         <tr>
@@ -1515,10 +1537,7 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
           <td><i>any</i>
           </td>
           <td>
-            Takes the first element of the array
-            <br/>
-             and (recursively) converts it to the needed
-            type
+            Takes the first element of the array and (recursively) converts it 
to the needed type
           </td>
         </tr>
         <tr>
@@ -1537,7 +1556,8 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
     </section>
 
 
-    <section name="Internationalization">
+    <section>
+      <h1>Internationalization</h1>
       <p>
         For DOM Documents JXPathContext supports internationalization
         XPath-style. A locale can be declared on an XML Element like
@@ -1545,10 +1565,10 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
      &lt;book xml:lang="fr"&gt;Les Miserables&lt;/book&gt;
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
@@ -1557,17 +1577,17 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
      "//book[lang('fr')]
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
         The <code>"lang"</code>  boolean function is supported for
         non-DOM objects as well. It tests the Locale set on the
         JXPathContext (or the default locale). See
-        <a 
href="apidocs/org/apache/commons/jxpath/JXPathContext.html#setLocale">JXPathContext.setLocale()</a>.
+        <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/JXPathContext.html#setLocale";>JXPathContext.setLocale()</a>.
       </p>
       <p>
         You can also utilize the <code>xml:lang</code>  attribute,
@@ -1576,8 +1596,8 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </p>
     </section>
 
-
-    <section name="Nested Contexts">
+    <section>
+      <h1>Nested Contexts</h1>
       <p>
         If you need to use the same configuration (variables, functions, 
abstract
         factories, locale, leniency etc.)
@@ -1589,8 +1609,8 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
  JXPathContext sharedContext = JXPathContext.newContext(null);
  sharedContext.getVariables().declareVariable("title", "Java");
  sharedContext.setFunctions(new MyExtensionFunctions());
@@ -1603,13 +1623,13 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
 
  Iterator javaBooks =
       context.iterate("books[preprocessTitle(title) = $title]");
- </source>
+ </code></pre>
 <!--============================ - SOURCE - ============================-->
 
     </section>
 
-
-    <section name="Compiled Expressions">
+    <section>
+      <h1>Compiled Expressions</h1>
       <p>
         When JXPath is asked to evaluate an expression for the first
         time, it compiles it and caches its compiled representation.
@@ -1623,12 +1643,12 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </p>
 
 <!--============================ + SOURCE + ============================-->
-<source>
-                                                                       <b/>
+<pre><code>
+
      CompiledExpression expr = context.compile(xpath);
      ...
      Object value = expr.getValue(context);
-</source>
+</code></pre>
 <!--============================ - SOURCE - ============================-->
 
       <p>
@@ -1651,8 +1671,8 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
       </ul>
     </section>
 
-
-    <section name="Customizing JXPath">
+    <section>
+      <h1>Customizing JXPath</h1>
       <p>
         JXPath can be customized on several levels.
       </p>
@@ -1683,18 +1703,18 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
         </li>
       </ul>
 
-
-      <subsection name="Custom JXPathBeanInfo">
+      <section>
+        <h2>Custom JXPathBeanInfo</h2>
         <p>
           JXPath uses JavaBeans introspection to discover properties
           of JavaBeans. You can provide alternative property lists by
           supplying custom JXPathBeanInfo classes (see
-          <a 
href="apidocs/org/apache/commons/jxpath/JXPathBeanInfo.html"><code>JXPathBeanInfo</code></a>).
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/JXPathBeanInfo.html";><code>JXPathBeanInfo</code></a>).
         </p>
-      </subsection>
-
+      </section>
 
-      <subsection name="Custom DynamicPropertyHandler">
+      <section>
+        <h2>Custom DynamicPropertyHandler</h2>
         <p>
           JXPath uses various implementations of the
           DynamicPropertyHandler interface to access properties of
@@ -1705,16 +1725,16 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
           package has several examples of custom
           DynamicPropertyHandlers.
         </p>
-      </subsection>
-
+      </section>
 
-      <subsection name="Custom Pointers and Iterators">
+      <section>
+        <h2>Custom Pointers and Iterators</h2>
         <p>
           Architecturally, multiple model support is made possible by
           the notions of a
-          <a 
href="apidocs/org/apache/commons/jxpath/ri/model/NodePointer.html">NodePointer</a>
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/ri/model/NodePointer.html";>NodePointer</a>
           and
-          <a 
href="apidocs/org/apache/commons/jxpath/ri/model/NodeIterator.html">NodeIterator</a>,
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/ri/model/NodeIterator.html";>NodeIterator</a>,
           which are simple abstract classes that are extended in
           different ways to traverse graphs of objects of different
           kinds. The NodePointer/NodeIterator APIs are designed with
@@ -1732,13 +1752,14 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
         <p>
           To add support for a new object model, build custom
           implementations of NodePointer and NodeIterator as well as
-          <a 
href="apidocs/org/apache/commons/jxpath/ri/model/NodePointerFactory.html">NodePointerFactory</a>.
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/ri/model/NodePointerFactory.html";>NodePointerFactory</a>.
           Then register the new factory with
-          <a 
href="apidocs/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.html">JXPathContextReferenceImpl</a>.
+          <a 
href="https://commons.apache.org/proper/commons-jxpath/apidocs/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.html";>JXPathContextReferenceImpl</a>.
         </p>
         <p>
           See existing NodePointerFactories for examples of how
           that's done:
+        </p>
           <ul>
             <li>
               BeanPointerFactory works with JavaBeans
@@ -1755,11 +1776,10 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
               DOMPointerFactory works with DOM Nodes
             </li>
           </ul>
-        </p>
-      </subsection>
-
+      </section>
 
-      <subsection name="Alternative JXPath Implementation">
+      <section>
+        <h2>Alternative JXPath Implementation</h2>
         <p>
           The core JXPath class, JXPathContext, allows for alternative 
implementations. 
           This is why instead of allocating JXPathContext directly, you
@@ -1769,7 +1789,7 @@ TypeUtils.setTypeConverter(new 
JXPath11CompatibleTypeConverter());
           bundled with a default implementation called Reference
           Implementation.
         </p>
-      </subsection>
+      </section>
     </section>
   </body>
-</document>
+</html>
diff --git a/src/site/resources/images/logo.jpg 
b/src/site/resources/images/logo-blue.jpg
similarity index 100%
copy from src/site/resources/images/logo.jpg
copy to src/site/resources/images/logo-blue.jpg
diff --git a/src/site/resources/images/logo-wbg.jpg 
b/src/site/resources/images/logo-wbg.jpg
deleted file mode 100644
index 16670e9..0000000
Binary files a/src/site/resources/images/logo-wbg.jpg and /dev/null differ
diff --git a/src/site/resources/images/logo.jpg 
b/src/site/resources/images/logo.jpg
index bf83d85..16670e9 100644
Binary files a/src/site/resources/images/logo.jpg and 
b/src/site/resources/images/logo.jpg differ
diff --git a/src/site/site.xml b/src/site/site.xml
index 0e759f9..943a645 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -17,41 +17,35 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
-<project>
-  <bannerRight>
-    <name>Commons JXPath</name>
-    <src>http://commons.apache.org/jxpath/images/logo-wbg.jpg</src>
-    <href>http://commons.apache.org/jxpath/</href>
+<site xmlns="http://maven.apache.org/SITE/2.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xsi:schemaLocation="http://maven.apache.org/SITE/2.0.0 
http://maven.apache.org/xsd/site-2.0.0.xsd"; name="Apache Commons JXPath">
+  <bannerRight name="Commons JXPath" href="/index.html">
+    <image src="/images/logo.png" />
   </bannerRight>
   <body>
-    <menu name="JXPath">
-      <item name="Overview"        href="/index.html"/>
-      <item name="Download"        
href="http://commons.apache.org/jxpath/download_jxpath.cgi"/>
-      <item name="User's Guide"    href="/users-guide.html"/>
-      <item name="Javadoc"         href="/apidocs/index.html"/>
-      <item name="Release Notes"   href="/release-notes-1.3.html"/>
-      <item name="Dependencies"    href="/dependencies.html"/>
-      <item name="License"         href="/license.html"/>
-      <item name="Wiki"            
href="http://wiki.apache.org/commons/JXPath"/>
-    </menu>
-    <menu name="JXPath 1.3">
-      <item name="Javadoc"         href="/javadocs/api-1.3/"/>
-      <item name="Release Notes"   href="/release-notes-1.3.html"/>
-    </menu>
-    <menu name="JXPath 1.2">
-      <item name="Javadoc"         href="/javadocs/api-1.2/"/>
-      <item name="Release Notes"   
href="http://commons.apache.org/jxpath/release-notes-1.2.html"/>
-    </menu>
-    <menu name="JXPath 1.1">
-      <item name="Javadoc"         href="/javadocs/api-1.1/"/>
-      <item name="Release Notes"   
href="http://commons.apache.org/jxpath/release-notes-1.1.html"/>
-    </menu>
-    <menu name="Development">
-      <item name="Mailing Lists"     href="/mail-lists.html"/>
-      <item name="Issue Tracking"    href="/issue-tracking.html"/>
-      <item name="Latest Javadoc"    href="/apidocs/index.html"/>
-      <item name="Source Repository" href="/source-repository.html"/>
-      <item name="Building"          href="/building.html"/>
+    <menu name="Commons JXPath">
+      <!-- Start: For all components. -->
+      <item name="About" href="/index.html" />
+      <item name="Asking Questions" href="/mail-lists.html" />
+      <item name="Release History" href="/changes.html" />
+      <item name="Issue Tracking" href="/issue-management.html" />
+      <item name="Dependency Management" href="/dependency-info.html" />
+      <item name="Sources" href="/scm.html" />
+      <item name="Security" href="/security.html" />
+      <item name="License" href="https://www.apache.org/licenses/LICENSE-2.0"; 
/>
+      <item name="Code of Conduct" 
href="https://www.apache.org/foundation/policies/conduct.html"; />
+      <item name="Download" href="/download_io.cgi" />
+      <item name="Javadoc">
+        <item name="Javadoc Current" href="/apidocs/index.html" />
+        <item name="Javadoc Archive" 
href="https://javadoc.io/doc/commons-jxpath/commons-jxpath"; />
+      </item>
+      <!-- End: For all components. -->
+      <item name="User's Guide" href="/apidocs/index.html" />
+      <item name="Wiki" href="http://wiki.apache.org/commons/JXPath"; />
+      <item name="Building" href="/building.html" />
+      <item name="Release Notes 1.1" 
href="http://commons.apache.org/jxpath/release-notes-1.1.html"; />
+      <item name="Release Notes 1.2" 
href="http://commons.apache.org/jxpath/release-notes-1.2.html"; />
+      <item name="Release Notes 1.3" 
href="http://commons.apache.org/jxpath/release-notes-1.3.html"; />
     </menu>
   </body>
-</project>
+</site>
diff --git a/src/site/xdoc/contributors.xml b/src/site/xdoc/contributors.xml
index 53548a6..e123d53 100644
--- a/src/site/xdoc/contributors.xml
+++ b/src/site/xdoc/contributors.xml
@@ -35,6 +35,7 @@
          <!-- alphabetical by last name please -->
          <ul>
             <li>Matt Benson</li>
+            <li><a href="https://www.garygregory.com";>Gary D. Gregory</a> (<a 
href="https://github.com/garydgregory";>GitHub</a>)</li>
             <li>Craig R. McClanahan</li>
             <li>Dmitri Plotnikov</li>
          </ul>
diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml
index cf5cde6..a26b1ca 100644
--- a/src/site/xdoc/index.xml
+++ b/src/site/xdoc/index.xml
@@ -79,7 +79,7 @@ while (it.hasNext()){
           <p>
             JXPath documentation currently contains:
             <ul>
-              <li><a href="users-guide.html">User's Guide</a></li>
+              <li><a href="apidocs/index.html">User's Guide</a></li>
               <li><a href="apidocs/index.html">Javadoc API 
Documentation</a></li>
 <!--              <li><a href="design.html">JXPath Design</a>, which is a 
document
                 primarily intended for those who are interested in extending 
JXPath.

Reply via email to