109,7 → 109,7 |
if("/".equals(element.getName())) { // absolute path |
element = (PathElement)path.get(1); |
|
if(path.size() > 1 && "**".equals(element.getName())) { |
if(path.size() > 0 && "**".equals(element.getName())) { |
// special case: '/**' |
startPos = 2; |
} |
279,11 → 279,9 |
{ |
if(pos >= path.size()) return node; |
|
NodeList list = node.getChildNodes(); |
int count = list.getLength(); |
PathElement element = (PathElement)path.get(pos); |
List idxElements = new ArrayList(); // list of desired elements |
// if some index is specified |
NodeList list = node.getChildNodes(); |
int count = list.getLength(); |
PathElement element = (PathElement)path.get(pos); |
|
// special element name - parent element |
if("..".equals(element.getName())) { |
309,18 → 307,9 |
Element e = (Element)subnode; |
|
if(testElement(element, params, e)) { |
if(element.getIndex() >= 0) |
idxElements.add(0, e); // if index specified then collect all desired nodes to list |
else |
return doStep(path, ++pos, params, e, update); // otherwise go to the node immed. |
return doStep(path, ++pos, params, e, update); |
} |
} |
|
// if index specified, test the collected desired items |
if(element.getIndex() >= 0) { |
if(element.getIndex() < idxElements.size()) // go to the node |
return doStep(path, ++pos, params, (Element)idxElements.get(element.getIndex()), update); |
} |
} |
|
// nothing found |
328,21 → 317,12 |
if(element.getName() == null) |
throw new PathCreateException("Cannot create element with name '*'"); |
|
Element newElement = null; |
Element newElement = document.createElement(element.getName()); |
setupElement(element, params, newElement); |
node.appendChild(newElement); |
lastElement = newElement; |
|
if(element.getIndex() >= 0) { |
for(int i = idxElements.size(); i <= element.getIndex(); i++) { |
newElement = createNewElement(element, params, node); // we need the last one only |
} |
} |
else { |
newElement = createNewElement(element, params, node); |
} |
|
if(newElement == null) |
throw new PathCreateException("Cannot create new element, internal error"); |
else |
return doStep(path, ++pos, params, newElement, update); |
return doStep(path, ++pos, params, newElement, update); |
} |
else { // not allowed to change document |
return null; |
349,16 → 329,6 |
} |
} |
|
protected Element createNewElement(PathElement element, Map params, Element node) |
{ |
Element newElement = document.createElement(element.getName()); |
setupElement(element, params, newElement); |
node.appendChild(newElement); |
lastElement = newElement; |
|
return newElement; |
} |
|
protected void setupElement(PathElement element, Map params, Element node) |
{ |
for(Iterator i = element.getConditions().iterator(); i.hasNext(); ) { |
564,20 → 534,6 |
"d", "0003" |
} ); |
|
// text indices |
tree.updateDocument( |
"/Vertrag/i# := '0'", |
null); |
tree.updateDocument( |
"/Vertrag/i[1]# := '1'", |
null); |
tree.updateDocument( |
"/Vertrag/i[7]# := '7'", |
null); |
tree.updateDocument( |
"/Vertrag/i[4]# := '4'", |
null); |
|
// test search ------------------------------------------------------------- |
|
tree.searchElement("/Vertrag/Sparten", (Object[])null); |