#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #include NavStepImpl::Axis PrecedingAxis::getAxis() const { return NavStepImpl::PRECEDING; } Sequence PrecedingAxis::makeList(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node, const XMLCh* const uri, DynamicContext* context) const { XPath2MemoryManager* memMgr=context->getMemoryManager(); Sequence precedingList(memMgr); Sequence ancestors=buildAncestorList(node, memMgr); Sequence::iterator endMinusOne = ancestors.end()-1; for(Sequence::iterator it = ancestors.begin(); it != endMinusOne; ++it) { const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* child=((const Node*)(*it))->getDOMNode(); Sequence::iterator next = it+1; addChildrenUntilNode(child, ((const Node*)*next)->getDOMNode(), &precedingList, uri, context); } return precedingList; } Sequence PrecedingAxis::buildAncestorList(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node, XPath2MemoryManager* memMgr) const { Sequence ancestorList(memMgr); //Add all ancestors const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *curNode = node; ancestorList.addItem(memMgr->createNode(curNode)); do { curNode = getParent(curNode); if(curNode == 0) { break; } if(curNode->getNodeType()!=XERCES_CPP_NAMESPACE_QUALIFIER DOMNode::ENTITY_REFERENCE_NODE) ancestorList.addItemFront(memMgr->createNode(curNode)); } while(curNode->getNodeType() != 0); return ancestorList; } void PrecedingAxis::addChildrenUntilNode(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node, const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *stopNode, Sequence *retList, const XMLCh* const uri, DynamicContext* context) const { XPath2MemoryManager* memMgr=context->getMemoryManager(); const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *currentNode = node->getFirstChild(); while(currentNode != 0) { if(currentNode==stopNode) break; // add the node only if it is not an entity reference if(currentNode->getNodeType() != XERCES_CPP_NAMESPACE_QUALIFIER DOMNode::ENTITY_REFERENCE_NODE && filterNode(currentNode, uri, context)) retList->addItem(memMgr->createNode(currentNode)); //recursively add descendants to the list if(currentNode->hasChildNodes()) { addTree(currentNode, retList, uri, context); }//if currentNode=currentNode->getNextSibling(); }//while }//makeListHelper void PrecedingAxis::addTree(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *node, Sequence *retList, const XMLCh* const uri, DynamicContext* context) const { XPath2MemoryManager* memMgr=context->getMemoryManager(); XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *child = node->getFirstChild(); while (child != 0) { // add the node only if it is not an entity reference if(child->getNodeType() != XERCES_CPP_NAMESPACE_QUALIFIER DOMNode::ENTITY_REFERENCE_NODE && filterNode(child, uri, context)) retList->addItem(memMgr->createNode(child)); //recursively add descendants to the list if(child->hasChildNodes()) { addTree(child, retList, uri, context); }//of child = child->getNextSibling(); }//while }//addTree