Implement a custom JUEL resolver for performing XPath queries on DOM Nodes
--------------------------------------------------------------------------

                 Key: OFBIZ-2397
                 URL: https://issues.apache.org/jira/browse/OFBIZ-2397
             Project: OFBiz
          Issue Type: New Feature
          Components: framework
    Affects Versions: SVN trunk
            Reporter: Scott Gray
            Assignee: Scott Gray
         Attachments: XPath.patch

In order to make XML easy to read using simple methods I've implemented a 
custom JUEL ELResolver that handles string properties for objects implementing 
org.w3c.dom.Node and org.apache.xerces.dom.NodeImpl.  It takes the String and 
compiles it into an XPathExpression which is then evaluated against the base 
Node.  The JUEL evaluation returns either null, a single Node or a NodeList 
depending on the result of the XPath evaluation.

Type conversion is handled using the set operation like so:
{code}
// Get the key attribute node from the first property element, note no type is 
specified so no conversion takes place
<set field="attributeNode" from-field="document['resource/property[1]/@key']"/>
// ObjectType.simpleTypeConvert calls getTextContent on the node, if the target 
type is anything other than a string it calls simpleTypeConvert again using the 
string
// Get the value of the attribute key from the first property element
<set field="attributeValue" from-field="document['resource/property[1]/@key']" 
type="String"/>
// If the key value were an Integer you could do this, the conversion would be 
node.getTextContent -> String -> Integer
<set field="attributeValue" from-field="document['resource/property[1]/@key']" 
type="Integer"/>
{code}

I've also added support for NodeList to the iterate tag so that you can do this:
{code:xml}
<iterate entry="node" list="parameters.document['resource/property']">
    <log level="always" message="Property Key: ${node['@key']}"/>
    <log level="always" message="First Value: ${node['value[1]']}"/>
</iterate>
{code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to