void XemProcessor::resolveNodeAndPushToNodeSet ( NodeSet& result, const String& nodeIdStr ) { KeyId attributeKeyId = 0; ElementRef resolvedElement = resolveElementWithRole ( nodeIdStr, attributeKeyId ); if ( !resolvedElement ) { throwException ( Exception, "Could not resolve element fro '%s'.\n", nodeIdStr.c_str() ); } if ( attributeKeyId ) { AttributeRef attrRef = resolvedElement.findAttr ( attributeKeyId, AttributeType_String ); if ( ! attrRef ) { throwException ( Exception, "Could not get attr '%x' in element %s from '%s'\n", attributeKeyId, resolvedElement.generateVersatileXPath().c_str(), nodeIdStr.c_str() ); } Log_XemRoleBased ( "Pushing attribute '%s'\n", attrRef.generateVersatileXPath().c_str() ); result.pushBack ( attrRef ); } else { Log_XemRoleBased ( "Pushing element '%s'\n", resolvedElement.generateVersatileXPath().c_str() ); result.pushBack ( resolvedElement ); } }
void XPath::evalFunctionKeyGet ( ElementMultiMapRef& map, XPath& useXPath, NodeSet& resultNodeSet, String& value ) { __ui64 hash = SKMapRef::hashString ( value ); Log_EvalKey ( "Computed value : '%s', hash='%llx'\n", value.c_str(), hash ); for ( SKMultiMapRef::multi_iterator miter ( map, hash ); miter ; miter++ ) { Log_EvalKey ( "Found iter %llx, val=%llx\n", miter.getHash(), miter.getValue() ); if ( miter.getHash() != hash ) { Log_EvalKey ( "Diverging keys : %llx != %llx\n", miter.getHash(), hash ); break; } ElementRef foundElt = map.get ( miter ); Log_EvalKey ( "Found elt=0x%llx\n", foundElt.getElementId() ); // AssertBug ( foundElt.getElementId(), "Null elementId ! Element was deleted ?\n" ); NodeSet foundValue; useXPath.eval ( foundValue, foundElt ); for ( NodeSet::iterator valiter ( foundValue ) ; valiter ; valiter++ ) { String eltValue = valiter->toString(); Log_EvalKey ( "Found node 0x%llx:%s, eltValue='%s'\n", foundElt.getElementId(), foundElt.getKey().c_str(), eltValue.c_str() ); if ( eltValue == value ) { resultNodeSet.pushBack ( foundElt, true ); Log_EvalKey ( "Matches !\n" ); } } } }